私は、次のようないくつかの奇妙なコードに出くわした:サブクラスのデストラクタが呼び出された場合は、そのベースクラスのデストラクタの呼び出しを停止できますか?
class B {
int* ab;
///...
~B() { /// not virtual
delete ab;
}
///...
}
class D : public B {
int* ad;
///...
~D() {
delete ab;
delete ad;
}
///...
}
しかし、私の意見では、サブクラスのデストラクタは間違いなくその基底クラスのデストラクタを呼び出します。だから、私は、サブクラスがその基本クラスによって割り当てられたリソースを解放する必要はないと思う。したがって、D
のデストラクタにdelete ab
を追加する必要はありません。悪いのは、delete
オブジェクトが2回間違っていることです。
しかし、このコードは私たちのシステムでは非常に長い間働いていて、私たちのテストケース全体に合格しています。このような奇妙な実装には他に何か考慮すべき点がありますか?
サブクラスのデストラクタが呼び出された場合、何が起きても基本クラスのデストラクタは後で呼び出されます。
サブクラスのデストラクタの実行後、ベースクラスのデストラクタの実行を停止する方法はありますか?
'〜B'は'〜D'の後に呼び出されます。このコードは、 'ab'が2回削除されるというバグがあります。 ( 'D'が削除された場合) –
コンパイル時にエラーが発生するか、実行時にエラーが発生するのはなぜですか@ MM –
[未定義の動作](http://stackoverflow.com/a/4105123/1505939) –