[英]C++ Inheritance without virtual destructors
如果父类的析构函数不是虚拟的,但是子类没有其他成员,那么使用父类的析构函数是否安全?
class A{
~A();
protected:
int i;
};
class B: public A{
}
A *x = new B; delete x;
简短的答案是不,这是不安全的。
这是不安全的,根据§5.3.5是未定义的行为
5.3.5删除[expr.delete]
3在第一个备选方案(删除对象)中,如果要删除的对象的静态类型与它的动态类型不同,则静态类型应为要删除的对象的动态类型的基类,而静态类型应为具有虚拟析构函数或行为未定义。 在第二种选择(删除数组)中,如果要删除的对象的动态类型与静态类型不同,则行为是不确定的。
为什么会中断的一个示例是:
class A
{
public:
~A();
protected:
int i;
};
class B: public A
{
virtual void dummy();
}
A *x = new B; delete x;
现在, B
具有vtbl,因此对象布局有所不同。
顺便说一句: public class A
是Java或其他某种语言,但不是C ++。
为什么要冒险?
确保基本类也被销毁的字节并不大。
还可以防止内存泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.