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

14

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

base_class *ptr = new derived_class;
delete ptr;

这段代码会导致内存泄漏吗?如果是,我该如何处理?


1
代码无法编译。我建议先通过编译器运行它。更好的做法是:base_class* ptr = new derived_class(); - Ciaran
4
如果 base_class 没有虚析构函数,这将触发未定义行为(§5.3.5/p3)。 - Marco A.
请参阅Scott Meyers所著的《Effective C++》中的第7项(在多态基类中声明虚析构函数)。 - Hari
1个回答

31

当你删除一个对象时,它不会泄漏内存块,其内存块将被释放。

如果你没有声明base_class中的析构函数为虚函数,那么就会泄漏在derived_class中包含的任何依赖于derived_class的析构函数来释放它们的动态分配对象。这是因为如果析构函数不是虚函数,在这种情况下,derived_class的析构函数不会被调用。这也意味着在derived_class中的“嵌入对象”的析构函数将不会自动调用,这是另一个问题,可能导致进一步的泄漏和重要清理代码未被执行。

总之,在base_class中声明析构函数为虚函数,就可以安全地使用所提出的技术。

有关编码示例,请参见:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接