13

デリータをタイプ消去できるという利点があるためboost::/std::shared_ptr、次のような素敵なことを行うことができます

#include <memory>

typedef std::shared_ptr<void> gc_ptr;

int main(){
  gc_ptr p1 = new int(42);
  gc_ptr p2 = new float(3.14159);
  gc_ptr p3 = new char('o');
}

そして、正しい削除が保存されているため、これによりすべてのポインターが正しく削除されます。

インターフェイスのすべての実装が常にshared_ptr<Interface>(または) で作成されることを保証する場合、実際にデストラクタmake_shared<Interface>が必要ですか? とにかくvirtual宣言しますが、知りたいのは、初期化された型を常に削除するためです(別のカスタムデリータが指定されていない限り)。virtualshared_ptr

4

1 に答える 1

14

派生することを意図したクラスの一般的なルールに従います。

パブリック仮想デストラクタまたは保護された非仮想デストラクタのいずれかを提供します

その理由は、すべての使用を制御することはできず、その単純なルールはdelete、階層内の間違ったレベルを通過しようとするとコンパイラがフラグを立てることを意味するためです。shared_ptr適切なデストラクタを呼び出すことを保証するものではなく、引数として使用された静的型のデストラクタを呼び出すことのみを考慮してください。

base* foo();
shared_ptr<base> p( foo() );

baseパブリックな非仮想デストラクタがあり、fooから派生した型を返す場合、正しいデストラクタを呼び出すことができません。のデストラクタが仮想の場合、すべて問題ありません。保護されている場合、コンパイラはそこにエラーがあることを通知します。baseshared_ptrbase

于 2011-07-09T12:38:49.887 に答える