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

dre*_*eta 7 c++

我有两个类,base_class和derived_class以及以下代码:

base_class *ptr = new derived_class;
delete ptr;
Run Code Online (Sandbox Code Playgroud)

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

Scr*_*ter 22

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

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

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

有关编码示例,请参阅:

在什么样的情况下,c ++析构函数不会被调用?