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