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

C++ Destructor - Explicit calls in an Inheritance context

本文关键字:调用 上下文 析构函数 继承 C++      更新时间:2023-10-16

我不确定我的问题有多中肯,但问题到此为止。

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

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

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

再次假设Animal包含几个动态分配的字段,Dog类添加了几个动态分配字段。

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

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

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

如果Animal的析构函数是virtual,则不会发生这种情况。

此外,您不需要调用~Animal()。一个例外是,如果您正在编写自己的分配器。通常您会调用delete a

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

不,不,不。除非在非常特殊的情况下,否则你永远不会显式地调用析构函数(据我所知,placement-new和union是两个)。

这里需要做的是在指针上调用delete。正如rlbond已经说过的,只要基类的析构函数是虚拟的,通过基指针删除就可以了。