【问题标题】: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 在没有虚拟析构函数的情况下被删除会发生什么?

【问题讨论】:

标签: c++ virtual delete-operator virtual-destructor


【解决方案1】:

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

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

5.3.5 Delete [expr.delete]

(强调我的)

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

【讨论】:

  • @downvoter 请告诉我哪里错了,我可以改进它。
猜你喜欢
  • 2012-10-11
  • 2011-03-16
  • 2012-12-20
  • 1970-01-01
  • 2018-07-23
  • 2021-03-20
  • 2022-06-27
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多