繁体   English   中英

没有虚拟析构函数的C ++继承

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM