【问题标题】:Deleting a derived object via a pointer to its base class通过指向其基类的指针删除派生对象
【发布时间】:2012-02-05 00:46:06
【问题描述】:

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

base_class *ptr = new derived_class;
delete ptr;

这段代码会产生内存泄漏吗?如果有,应该怎么处理?

【问题讨论】:

  • 代码无法编译。我建议先通过编译器传递它。更好的是:base_class* ptr = new derived_class();
  • 如果 base_class 没有虚拟析构函数,这将触发未定义的行为 (§5.3.5/p3)

标签: c++


【解决方案1】:

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

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

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

有关编码示例,请参阅:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2014-06-16
    • 2015-07-02
    • 1970-01-01
    • 2011-11-04
    • 2021-05-20
    • 2019-01-22
    相关资源
    最近更新 更多