当删除没有虚拟析构函数的多态对象时会发生啥?
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 请告诉我哪里错了,我可以改进它。以上是关于当删除没有虚拟析构函数的多态对象时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章