ホームページ > バックエンド開発 > C++ > 「shared_ptr」は、「Base」の仮想デストラクタなしで「派生」オブジェクトを管理できますか?

「shared_ptr」は、「Base」の仮想デストラクタなしで「派生」オブジェクトを管理できますか?

Mary-Kate Olsen
リリース: 2024-12-09 20:53:10
オリジナル
461 人が閲覧しました

Can `shared_ptr` Manage `Derived` Objects Without a Virtual Destructor in `Base`?

Shared_Ptr と仮想デストラクターを使用しないポリモーフィズム

最近の議論で、Daniel Lidström は、shared_ptr は次のように主張しました。新しい Derived で構築された場合、Base での仮想デストラクターは必須ではありません。この記事では、そのような実装の実現可能性を調査します。

仮想デストラクターを使用しない Shared_Ptr の実装

この実装の鍵は型の消去にあります。 Shared_ptr には参照カウンター以上のものが保存されます。これには、オブジェクトの破棄を処理するデリーター (データ構造の一部として保存) が含まれています。このデリーターは任意のタイプにすることができ、T (shared_ptr のテンプレート タイプ) の範囲を超えたカスタマイズが可能です。

派生クラスのカスタマイズ

shared_ptr の作成時< ;ベース> Derived オブジェクトからは、テンプレート化されたコンストラクターが呼び出され、具象型 Derived の指定が可能になります。コンストラクターは、動的型の知識を使用して必要なデリーターを作成し、Base に仮想デストラクターがなくても適切なオブジェクトの破棄を保証します。

実装例

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};
ログイン後にコピー

上記コンストラクターを使用すると、shared_ptr の作成が可能になります。

C 11 標準の要件

C 11 標準では、次の動作が明示的に要求されています。

  • テンプレート化されたコンストラクターは、次のことを確認する必要があります。式 delete p には、仮想デストラクターがなくても、明確に定義された動作があることを確認します。 T.
  • shared_ptr がデリーターなしでオブジェクトを所有している場合、delete p を呼び出す必要があります。

以上が「shared_ptr」は、「Base」の仮想デストラクタなしで「派生」オブジェクトを管理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート