私たちの議論では、shared_ptrの実装のために多態性クラスに仮想デストラクターを要求する必要性について疑問を呈しました。提示された議論は、shared_ptr はこの要件がなくても正しく機能できると主張しました。
この主張の妥当性を判断するために、shared_ptr の実装をさらに詳しく見てみましょう。
型消去とテンプレート化されたコンストラクター
shared_ptr は型 Erasure を利用して同じメモリ ブロック内にデリーターを格納します参照カウンタとして。このデリーターのタイプは、shared_ptr タイプの一部ではありません。テンプレート化されたコンストラクターを採用することにより、shared_ptr は管理対象の特定のクラスに基づいてさまざまなデリーター タイプに対応できます。
これを処理するために次のコンストラクターを定義できます。
template<class T> class shared_ptr { public: ... template<class Y> explicit shared_ptr(Y* p); ... };
このコンストラクターを使用する場合Base クラスと Derived クラスでは、適切なデリーターを作成して保存できます。このデリーターは、参照カウンタがゼロになると呼び出され、適切なオブジェクトの破棄が保証されます。
C 11 標準要件
C 11 標準では、この動作を明示的に要求しています。テンプレート化されたコンストラクター:
"効果: ポインターを所有するshared_ptrオブジェクトを構築します。 p."
これにより、shared_ptr が渡されたポインタの所有権を引き継ぎ、その破棄を担当することが確認されます。
デストラクタの機能
デストラクタの動作は次のとおりです。次のように定義されています:
"効果: this がオブジェクト p を所有している場合それ以外の場合、this がポインター p を所有し、delete p が呼び出されます。"
これは、shared_ptr がポインターを直接管理する (つまり、明示的なデリーター)、デフォルトのデストラクター削除は、 object.
結論
これらのガイドラインに基づくと、仮想デストラクターを持つ多態性クラスを必要とせずにshared_ptrを実装できることは明らかです。型消去やテンプレート化されたコンストラクターなどの前述の手法により、shared_ptr はポリモーフィズムをサポートしないオブジェクトを含むあらゆる型のオブジェクトを効果的に管理できるようになります。
以上が「shared_ptr」は多態性クラスの仮想デストラクターなしで正しく機能できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。