3
BaseClass * p = new DerivedClass();
delete p;

2行目は、仮想デストラクタがない場合は基本クラスのデストラクタを呼び出し、存在する場合は派生クラスのデストラクタを呼び出しますがdelete、メモリを適切に解放します(たとえば、BaseClassのオブジェクトが8バイトのスペースを占有し、DerivedClassの 12 - 8 バイトまたは 12 バイトを解放し、どちらの場合もオブジェクトを削除しますか?

4

2 に答える 2

5

もちろん、デストラクタがある場合virtual、オブジェクトは破棄され、メモリは期待どおりに解放されます。デストラクタがない場合virtual、動作は未定義です。

削除するオブジェクトの静的型がその動的型と異なる場合、静的型は削除するオブジェクトの動的型の基本クラスであり、静的型は仮想デストラクタを持つ必要があります。そうしないと、動作が未定義になります。

したがって、メモリの割り当てが完全に解除されるかどうかを判断しようとしても意味がありません。プログラムは、メモリを使って好きなことを行うことができます。

于 2013-05-11T14:50:18.623 に答える