3

仮想デストラクタについて混乱しています。多くの質問と説明を読みましたが、基本クラスから派生したクラスがある場合、特別な操作がなくても独自のデストラクタを実装する必要があることをまだ理解していません。

コンパイラは以下のコードをコンパイルしますが、メモリ リークや問題はありますか?

Class Base{
public:
virtual ~Base(){}
};

Class Derived : public Base{
// do i need a special destructor here for Derived ?
}

Base *foo;
foo = new Derived;
delete foo;
4

2 に答える 2

2

のデストラクタを指定しない場合はDerived、自動的に作成されます。自動的に作成されたデストラクタは のデストラクタをオーバーライドするBaseため、 を削除すると呼び出されますfoo。自動的に作成されたデストラクタは、次のようになります。

Class Derived : public Base {
  ~Derived() { } // this is what you get if you don't provide your own.
}

すべてのデストラクタは、自動的に作成されるかどうかに関係なく、クラスのすべてのメンバーのデストラクタと基本クラスのデストラクタを自動的に呼び出します。そのため、すべてがきれいにクリーンアップされます。

于 2013-04-28T17:51:02.127 に答える
1

Derivedいいえ、暗黙的な仮想デストラクタを取得するため、メモリ リークは発生しません。

于 2013-04-28T17:47:47.537 に答える