如果父类的析构函数不是虚拟的,但子类没有其他成员,那么使用父类的析构函数是否安全?
class A{
~A();
protected:
int i;
};
class B: public A{
}
A *x = new B; delete x;
答案 0 :(得分:3)
简短的回答是不,这是不安全的。
答案 1 :(得分:3)
根据§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,因此对象布局不同。
BTW:public class A
是Java或其他语言,但不是C ++。
答案 2 :(得分:0)
为何冒风险?
确保基类被破坏的几个字节也不是那么重要。
也可以防止内存泄漏。