当删除没有虚拟析构函数的多态对象时会发生啥?

Posted

技术标签:

【中文标题】当删除没有虚拟析构函数的多态对象时会发生啥?【英文标题】:What happens when delete a polymorphic object without a virtual destructor?当删除没有虚拟析构函数的多态对象时会发生什么? 【发布时间】:2017-01-30 15:34:39 【问题描述】:

在下面的例子中,b是一个多态指针类型,它的static类型是Base*,它的dynamic类型是Derived*

struct Base 

  virtual void f();
;

struct Derived : Base 
 

;

int main()

   Base *b = new Derived();
   // ...
   delete b;

b 在没有虚拟析构函数的情况下被删除会发生什么?

【问题讨论】:

请阅读本文securecoding.cert.org/confluence/display/cplusplus/… Virtual destructor missing for base class in polymorphism = Ressource leak?的可能重复 【参考方案1】:

在没有虚拟析构函数的情况下删除 b 会发生什么?

我们不知道。行为未定义。对于大多数实际情况,Derived 的析构函数可能不会被调用,但没有任何保证。

5.3.5 Delete [expr.delete]

(强调我的)

在第一种选择(删除对象)中,如果是静态类型的 要删除的对象与其动态类型不同,静态 type 应该是对象的动态类型的基类 删除并且静态类型应该有一个虚拟析构函数或 行为未定义

【讨论】:

@downvoter 请告诉我哪里错了,我可以改进它。

以上是关于当删除没有虚拟析构函数的多态对象时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

调用具有条件变量等待的线程对象的析构函数时会发生啥?

多态和抽象

17. 虚析构函数再谈动态绑定多态到底是啥抽象类

c++ 析构函数 是在啥时候执行

条款7:为多态基类析构函数声明为virtual

为啥虚拟析构函数需要删除运算符