非ポリモーフィック シェアード ポインタ: 秘密を明らかにする
リドストローム氏とツィルニアン氏の間の激しい議論は、根本的な問題を提起します。ポリモーフィックの仮想デストラクターを義務付けずに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 サイトの他の関連記事を参照してください。