ホームページ > バックエンド開発 > C++ > shared_ptr はポリモーフィック クラス仮想デストラクターなしで動作しますか?

shared_ptr はポリモーフィック クラス仮想デストラクターなしで動作しますか?

Mary-Kate Olsen
リリース: 2024-12-16 11:45:11
オリジナル
129 人が閲覧しました

Can shared_ptr Work Without Polymorphic Class Virtual Destructors?

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

shared_ptr 実装における仮想デストラクターの必要性に関する Armen Tsirunyan と Daniel Lidstrom 間の議論では、確かに、そのようなものを必要としないshared_ptrを設計することは可能です。デストラクター。

技術的な実装

この実装の鍵は、型消去にあります。 Shared_ptr はリファレンスカウンタだけでなく、同じメモリブロックに格納されているデリーターオブジェクトも管理します。このデリーターのタイプはshared_ptrのタイプとは異なり、異なる動的タイプのオブジェクトを柔軟に管理できるようになります。

テンプレート化されたコンストラクターが導入されています。

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

派生クラスのポインター (例:shared_ptr sp (new Derived))、テンプレート化されたコンストラクターY=派生が呼び出されます。このコンストラクターは、派生クラスの特定の知識を使用してデリーター オブジェクトを作成します。参照カウントがゼロに達すると、Base クラスに仮想デストラクターがなくても、このデリーターは派生インスタンスを安全に破棄するために使用されます。

C 11 標準要件

C 11 標準では、このコンストラクターの要件を明示的に定義しています。

  • ポインター p T* に変換可能である必要があり、Y は完全な型である必要があります。
  • 式「delete p」は適切な形式であり、明確に定義された動作を持ち、例外をスローしてはなりません。

デストラクターの場合:

  • shared_ptr が空であるか、所有権を共有している場合、サイドはありません。効果。
  • shared_ptr がデリーター d を持つオブジェクトを所有している場合、d(p) が呼び出されます。
  • それ以外の場合、shared_ptr がポインター p を所有している場合、「delete p」が呼び出されます。

したがって、shared_ptr 実装は型消去を利用し、デリータを慎重に管理してオブジェクトを効果的に破棄します。多態性クラスで仮想デストラクターを必要としなくても、異なる動的型を使用できます。

以上がshared_ptr はポリモーフィック クラス仮想デストラクターなしで動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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