ホームページ > バックエンド開発 > C++ > 「shared_ptr」は多態性クラスの仮想デストラクターなしで動作できますか?

「shared_ptr」は多態性クラスの仮想デストラクターなしで動作できますか?

Patricia Arquette
リリース: 2024-12-06 06:44:12
オリジナル
278 人が閲覧しました

Can `shared_ptr` Work Without Virtual Destructors in Polymorphic Classes?

非ポリモーフィック シェアード ポインタ: 秘密を明らかにする

リドストローム氏とツィルニアン氏の間の激しい議論は、根本的な問題を提起します。ポリモーフィックの仮想デストラクターを義務付けずにshared_ptrを実装することは可能ですクラスは?

先生。 redström の主張は、shared_ptr

しかし、C 11 標準と Boost ライブラリは、そのようなデストラクターが必要であることを示しています。確かに実装は可能です。この偉業は、「型消去」の概念を通じて実現されます:

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};</p>
<p>提供された例では、shared_ptr<Base><sp(new Derived);、Y=Derived を指定したテンプレート化されたコンストラクターが作成および初期化されます。 shared_ptr オブジェクト。重要なのは、このコンストラクターは、参照カウンターを含む制御ブロックへのポインターと、派生クラス専用に調整されたデリーター オブジェクトを格納することです。</p>
<p>参照カウントがゼロになると、デリーター オブジェクトは、その知識を備えて、派生クラスの構造体は、割り当てられたメモリを破棄するために呼び出されます。</p>
<p>C 11 標準では、この動作を要件で明示的に指定しています。 constructor:</p>
<pre class="brush:php;toolbar:false">Requires: ... The expression delete p shall be well formed, shall have well defined behaviour and shall not throw exceptions.
Effects: Constructs a shared_ptr object that owns the pointer p.
ログイン後にコピー

これにより、ポインターが Derived から Base にキャストされた場合でも、デリーターが適切に呼び出され、メモリが安全に解放されることが保証されます。

同様に、標準ではデストラクターの概要が説明されています。動作:

Effects: ... Otherwise, if *this owns a pointer p, and delete p is called.
ログイン後にコピー

テンプレート化されたコンストラクターと型の消去を利用することで、shared_ptr は回避できます。多態性クラスでの仮想デストラクターの必要性により、より広範囲のシナリオで効率的なメモリ管理が可能になります。

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

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