为什么我们需要一个带动态内存的虚拟析构函数?

时间:2014-01-06 19:14:07

标签: c++ virtual-destructor

为什么在继承时我们需要一个带有动态变量的虚析构函数?在静态/动态情况下析构函数执行的顺序是什么?最派生类的析构函数是否总是先执行?

2 个答案:

答案 0 :(得分:4)

当您通过基类指针尝试virtual派生类对象时,在基类中需要一个delete析构函数。

pont案例:

class Foo
{
public:
  virtual ~Foo(){};
};

class Bar : public Foo
{
public:
  ~Bar() { std::cout << "Bye-Bye, Bar"; }
};

int main()
{
  Foo* f = new Bar;
  delete f;
}

如果基类中没有virtual析构函数,则不会在此处调用Bar的析构函数。

答案 1 :(得分:2)

想象一下你有这个:

class A { 
  public:
  int* x;     
}
class B : public A {
  public:
  int *y;
}


main() {
  A *var = new B;
  delete var;
}

请假设一些构造函数析构函数。 在这种情况下,当你删除A.如果你有虚拟析构函数,那么将首先调用B析构函数来释放y,然后调用A来释放x。

如果它不是虚拟的,它只会调用A的析构函数泄漏y。

问题是编译器无法事先知道它应该调用哪个析构函数。想象一下,你有一个如果构造A或B取决于一些输入并将其赋值给var。 通过使其成为虚拟,您可以使编译器在实际调用之前执行调用。在运行时,它将根据vtable知道哪个是正确的析构函数。