删除没有虚析构函数的多态对象会发生什么?

时间:2016-09-22 07:14:54

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

在下面的示例中,b是一种多态指针类型,其静态类型为Base*,其动态类型为Derived*

struct Base 
{
  virtual void f();
};

struct Derived : Base 
{ 

};

int main()
{
   Base *b = new Derived();
   // ...
   delete b;
}

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

2 个答案:

答案 0 :(得分:2)

  

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

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

5.3.5 Delete [expr.delete]

(强调我的)

  

在第一个替代(删除对象)中,如果是静态类型的   要删除的对象不同于其动态类型,静态   type应该是对象的动态类型的基类   删除和静态类型应具有虚拟析构函数或   行为未定义

答案 1 :(得分:0)

实际上它取决于目标编译器和常见情况

delete b;

调用descructor函数用于b的类型,然后调用自由分配的内存。 因此,如果析构函数是虚拟的,则从虚拟表(~Derived)调用函数,但如果不是,则从类(~Base)调用函数。 预期结果:〜仅调用Base。