我遇到了一些奇怪的代码,如下所示:
class B {
int* ab;
///...
~B() { /// not virtual
delete ab;
}
///...
}
class D : public B {
int* ad;
///...
~D() {
delete ab;
delete ad;
}
///...
}
但在我看来,子类的析构函数肯定会调用其基类的析构函数。所以,我认为子类不需要释放由其基类分配的资源。因此,无需在类delete ab
的析构函数中添加D
。更糟糕的是,delete
一个对象两次是错误的。
但是,这段代码在我们的systmem中运行很长时间并通过我们的整个测试用例。在这种奇怪的实现中还有其他考虑因素吗?
所以我徘徊,如果调用子类的析构函数,那么,无论发生什么,基类的析构函数都将在稍后调用。
或者,在执行子类的析构函数之后,有没有办法停止执行基类的析构函数?
答案 0 :(得分:2)
如果a B
实例被破坏,那么将调用D
类析构函数是正确的。 <{1}} dtor中对delete ab;
的调用是一个错误。
此代码需要考虑的另一件事是,由于D
的dtor不是虚拟的,因此您无法通过B
指针删除D
的实例。< / p>
B
的DTOR在两种情况下都是错误的,但绝对应该改变。如果您计划以多态方式使用类的层次结构,那么您还必须将D
DTOR更改为虚拟。