如果调用了 subclass 的析构函数,我可以停止对其基 class 的析构函数的调用吗?
If the destructor of a subclass was called, can I stop the call to the destructor of its base class?
我遇到了一些奇怪的代码,如下所示:
class B {
int* ab;
///...
~B() { /// not virtual
delete ab;
}
///...
}
class D : public B {
int* ad;
///...
~D() {
delete ab;
delete ad;
}
///...
}
但是在我看来,subclass的析构函数肯定会调用它的baseclass的析构函数。所以,我认为 subclass 不需要释放其基 class 分配的资源。因此,在classD
的析构函数中不需要添加delete ab
。更糟糕的是,delete
一个对象两次都是错误的。
然而,这段代码在我们的系统中运行了很长时间并且通过了我们的整个测试用例。这种奇怪的实现还有其他考虑吗?
所以我想了想,如果调用了subclass的析构函数,那么无论发生什么,后面都会调用baseclass的析构函数
或者,在subclass的析构函数执行后,有没有办法停止baseclass的析构函数的执行?
你说得对,B
class 析构函数将在 D
实例被析构时调用。 D
dtor 中对 delete ab;
的调用是一个错误。
这段代码要考虑的另一件事是,因为 B
的 dtor 不是虚拟的,所以你不能通过 B
指针删除 D
的实例。
D
的 DTOR 在这两种情况下都不正确,绝对应该更改。如果您计划以多态方式使用 classes 的层次结构,那么您还必须将 B
DTOR 更改为虚拟的。
我遇到了一些奇怪的代码,如下所示:
class B {
int* ab;
///...
~B() { /// not virtual
delete ab;
}
///...
}
class D : public B {
int* ad;
///...
~D() {
delete ab;
delete ad;
}
///...
}
但是在我看来,subclass的析构函数肯定会调用它的baseclass的析构函数。所以,我认为 subclass 不需要释放其基 class 分配的资源。因此,在classD
的析构函数中不需要添加delete ab
。更糟糕的是,delete
一个对象两次都是错误的。
然而,这段代码在我们的系统中运行了很长时间并且通过了我们的整个测试用例。这种奇怪的实现还有其他考虑吗?
所以我想了想,如果调用了subclass的析构函数,那么无论发生什么,后面都会调用baseclass的析构函数
或者,在subclass的析构函数执行后,有没有办法停止baseclass的析构函数的执行?
你说得对,B
class 析构函数将在 D
实例被析构时调用。 D
dtor 中对 delete ab;
的调用是一个错误。
这段代码要考虑的另一件事是,因为 B
的 dtor 不是虚拟的,所以你不能通过 B
指针删除 D
的实例。
D
的 DTOR 在这两种情况下都不正确,绝对应该更改。如果您计划以多态方式使用 classes 的层次结构,那么您还必须将 B
DTOR 更改为虚拟的。