通过指向其基类的指针删除派生对象

时间:2012-01-07 10:26:03

标签: c++

我有两个类,基类和派生类以及以下代码:

base_class *ptr = new derived_class;
delete ptr;

此代码是否会产生内存泄漏?如果是这样,我该如何处理呢?

1 个答案:

答案 0 :(得分:22)

它不会泄漏您正在删除的对象,其内存块将被释放。

如果你还没有在base_class中声明析构函数是虚拟的,那么它泄漏derived_class中包含的依赖于{{1的析构函数'的任何动态分配的对象被召唤来释放他们。这是因为如果析构函数不是虚拟的,则在这种情况下不会调用derived_class析构函数。这也意味着derived_class中的“嵌入对象”的析构函数不会被自动调用,这是一个单独但又附加的问题,可能导致进一步泄漏并且不执行重要的清理代码。

简而言之,声明derived_class中的析构函数是虚拟的,您可以安全地使用您提供的技术。

有关编码示例,请参阅:

In what kind of situation, c++ destructor will not be called?