why do we need a virtual destructor with dynamic memory?
当我们有继承时,为什么我们需要一个带有动态变量的虚拟析构函数?在静态/动态情况下,析构函数的执行顺序是什么?最派生类的析构函数不是总是先执行吗?
- 您需要这样做,以便在通过基类指针删除派生类型实例时,同时调用基类型和派生类型的析构函数。这应该在任何介绍性C++书籍中解释。另外,请一次回答一个问题。
- 您可以在本文中找到有关虚拟析构函数的详细信息:studytoneght.com/cpp/virtual-destructors.php
当试图通过基类指针来delete派生类对象时,需要在基类中有一个virtual析构函数。
庞氏案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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的析构函数。
- "Without the virtual destructor in the base class,bar's destructor would not be called here."O.K.That's what virtual keyword mean,but then when it should be used?Always?In your example,if bar;s destructor is not called them what is the problem?
- @Dicapio:As a general rule of thumb,you should always have virtual destructors in the base class if the class is going to be derived from.
想象一下你有这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class A {
public:
int* x;
}
class B : public A {
public:
int *y;
}
main() {
A *var = new B;
delete var;
} |
请假定一些构造函数析构函数。在这种情况下,当您删除a时,如果您有虚拟析构函数,那么将首先调用b析构函数来释放y,然后调用a's来释放x。
如果不是虚拟的,它只会调用a的析构函数leaking y。
问题是编译器不能预先知道应该调用哪个析构函数。假设上面有一个if,它根据一些输入构造a或b,并将其赋给var。通过使其虚拟化,可以使编译器在运行时解除实际调用。在运行时,它将知道哪个是基于vtable的正确析构函数。
- 我想你是指0音标的音标
- 你的例子并没有真正说明问题和如何最好地使用虚拟毁灭者。
- @Sorin that's what I wanted to know,that the compiler calls the destructor of the base class only if there i s no virtual.并呼吁驱逐舰在虚拟的情况下是在这些基地的破坏性
- This is,of course,not the correct answer.如果驱逐舰ISN't virtual,literally anything can happen(and I've see cases where i t caused the program to crash,or corrupted memory in other objects).