C ++析构函数 - 继承上下文中的显式调用

时间:2015-06-29 21:37:35

标签: c++ memory destructor

我不确定我的问题是多么相关,但现在就这样了。

我知道我们只应该在堆上分配内存时显式调用析构函数。

所以我们假设我们有两个类:Animal和Dog,它是Animal的一个子类。

    Animal a* = new Dog();
    //-------Do something here-----//
    a -> ~Animal();

再次,让我们说动物包含几个动态分配的字段,并且Dog类添加了几个动态分配的字段。

因为Dog有更多字段,调用Animal析构函数会导致内存泄漏。这只是糟糕的编程风格还是我们可以找到解决方法?

我想我们需要将指针转换为Dog类型,然后调用析构函数,但我无法找到有关如何正确执行此操作的任何参考。

2 个答案:

答案 0 :(得分:7)

  

因为Dog有更多字段,调用Animal析构函数会导致内存泄漏。

如果footer .container { font-size: 18px; text-align: center; } 的析构函数为Animal,则不会发生这种情况。

此外,您无需致电virtual。一个例外是如果您正在编写自己的分配器。通常情况下,请拨打~Animal()

答案 1 :(得分:3)

  

我知道我们只应该在堆上分配内存时显式调用析构函数。

不,不,不,不,不,不。你永远不会明确地调用析构函数,除非在非常具体的情况下(放置新的和联合是我所知道的两个)。

您需要在此处执行的操作是在指针上调用delete。正如rlbond已经说过的那样,只要基类的析构函数是虚拟的,就可以通过基指针进行删除。