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 删除
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++。
简短的回答是否定的,这是不安全的。
为什么要冒险?
几个字节来确保基类也被销毁并不是那么大。
还可以防止内存泄漏。
相关文章:
- C++ std::vector 中的虚拟析构函数继承
- 继承的类析构函数
- 抽象类析构函数与继承"Shutdown"函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 如果不手动完成,子类是否继承父类的析构函数?
- 从 std::streambif 继承时不兼容析构函数编译器警告
- 多重继承析构函数调用他自己和父析构函数?c++
- 为什么我在使用组合而不是继承时得到 C4624(无法访问基类析构函数)
- 抽象基类中的析构函数保护不会在 C++ 中继承
- C++继承和构造函数、析构函数
- 从 STL 容器继承并删除"新"运算符以防止由于缺少虚拟析构函数而导致未定义的行为是否有意义?
- 虚拟继承中的析构函数
- 复制、移动、交换、赋值和析构函数的C++继承?我需要哪个
- 在不使用虚拟析构函数的情况下删除继承的对象时中止
- 在 4 级继承链中C++虚拟析构函数
- C++ 无虚拟析构函数的继承
- C++析构函数继承
- 从没有虚拟析构函数的类继承
- C++非抽象析构函数继承
- C++继承:缺少虚拟析构函数会导致内存泄漏