【发布时间】:2016-08-18 09:10:58
【问题描述】:
我遇到了一些奇怪的代码,如下所示:
class B {
int* ab;
///...
~B() { /// not virtual
delete ab;
}
///...
}
class D : public B {
int* ad;
///...
~D() {
delete ab;
delete ad;
}
///...
}
但在我看来,子类的析构函数肯定会调用其基类的析构函数。所以,我认为子类没有必要释放其基类分配的资源。因此,不需要在类D 的析构函数中添加delete ab。更糟糕的是,delete 一个对象两次是错误的。
但是,这段代码在我们的系统中运行良好很长时间,并且通过了我们的整个测试用例。在这种奇怪的实现中还有其他考虑吗?
所以我徘徊,如果子类的析构函数被调用,那么,无论发生什么,基类的析构函数都会被调用。
或者,子类的析构函数执行后,有什么办法可以停止基类的析构函数的执行?
【问题讨论】:
-
~B在~D之后调用。此代码有一个错误,即ab被删除了两次。 (如果删除了D,即) -
编译时错误或运行时错误?因为它有效。@M.M
-
@YuanWen:不,它不起作用。如果你不走运,它可能会出现。
-
但是在我们的实践中,它运行良好,你知道为什么吗?代码是别人写的。@LightnessRacesinOrbit
标签: c++ destructor