C++ 析构函数 - 继承上下文中的显式调用
C++ Destructor - Explicit calls in an Inheritance context
我不确定我的问题是否中肯,但就是这样。
我知道我们应该只在堆上分配内存时显式调用析构函数。
假设我们有两个 classes:Animal 和 Dog,它们是 Animal 的子class。
Animal a* = new Dog();
//-------Do something here-----//
a -> ~Animal();
同样,假设 Animal 包含几个动态分配的字段,而 Dog class 添加了几个动态分配的字段。
由于Dog的字段较多,调用Animal的析构函数会导致内存泄漏。这仅仅是糟糕的编程风格还是我们可以找到解决方法?
我想我们需要将指针转换为 Dog 类型,然后调用析构函数,但我找不到任何关于如何正确执行此操作的参考。
Because Dog has more fields, calling the Animal destructor will result in memory leakage.
如果 Animal
的析构函数是 virtual
,则不会发生这种情况。
此外,您不需要调用~Animal()
。一个例外是如果您正在编写自己的分配器。通常您会调用 delete a
。
I know that we should only call the destructor explicitly when we allocated memory on the heap.
不,不,不,不,不。除非在非常特殊的情况下,否则你永远不会显式地调用析构函数(据我所知,placement new 和 union 是这两个)。
你需要做的是在指针上调用 delete
。正如 rlbond 已经指出的那样,只要基 class 的析构函数是虚拟的,通过基指针删除就可以了。
我不确定我的问题是否中肯,但就是这样。
我知道我们应该只在堆上分配内存时显式调用析构函数。
假设我们有两个 classes:Animal 和 Dog,它们是 Animal 的子class。
Animal a* = new Dog();
//-------Do something here-----//
a -> ~Animal();
同样,假设 Animal 包含几个动态分配的字段,而 Dog class 添加了几个动态分配的字段。
由于Dog的字段较多,调用Animal的析构函数会导致内存泄漏。这仅仅是糟糕的编程风格还是我们可以找到解决方法?
我想我们需要将指针转换为 Dog 类型,然后调用析构函数,但我找不到任何关于如何正确执行此操作的参考。
Because Dog has more fields, calling the Animal destructor will result in memory leakage.
如果 Animal
的析构函数是 virtual
,则不会发生这种情况。
此外,您不需要调用~Animal()
。一个例外是如果您正在编写自己的分配器。通常您会调用 delete a
。
I know that we should only call the destructor explicitly when we allocated memory on the heap.
不,不,不,不,不。除非在非常特殊的情况下,否则你永远不会显式地调用析构函数(据我所知,placement new 和 union 是这两个)。
你需要做的是在指针上调用 delete
。正如 rlbond 已经指出的那样,只要基 class 的析构函数是虚拟的,通过基指针删除就可以了。