c++ - 非虚平凡析构函数+继承

标签 c++ inheritance destructor

鉴于一个类及其所有子类只需要默认析构函数来释放它们的资源,如果存储在确切类型的变量(或指向确切类型的指针)中,那么如果被基类引用,子类是否会泄漏内存类指针然后被那个指针删除?

示例:

#include <memory>

class A {
};

class B : public A {
public:
    B () : pInt(new int) {}
    auto_ptr<int> pInt; // this is what might leak... possibly more will though
};

void will_this_leak () {
    A *pA = new B();
    delete pA;
}

最佳答案

“内存泄漏”?为什么要专门谈论内存泄漏?

您发布的代码产生了未定义的行为。在这种情况下任何事情都可能发生:内存泄漏、硬盘格式化、程序崩溃等。

附言我知道有一个流行的都市传说,即在没有虚拟析构函数的情况下执行多态破坏“可能会泄漏内存”。我不知道是谁发明了这些废话,也不知道他们为什么决定使用“内存泄漏”作为可能发生的情况的主要场景。实际上,这种情况下的行为与“内存泄漏”完全无关。行为是未定义的。

从实际的角度来看,在您的特定情况下,很明显您的 auto_ptr 的析构函数没有真正的机会被调用,因此 auto_ptr 拥有的内存 肯定会泄露。但同样,这是这段代码中最不重要的问题。

关于c++ - 非虚平凡析构函数+继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5970523/

相关文章:

c++ - 两种使用默认构造函数的区别

asp.net - Web.config 文件不继承所有父 Web.config 设置 (elmah)

python - 我可以从 python 类中删除继承的嵌套类吗?

c++ - 在 C++ 中强制最后破坏某些东西

c++ - 复制平凡可复制的对象是否总是在 C++14 中定义?

c++ - 简单的CEF项目不显示页面

c++ - 函数必须有返回值

c# - 覆盖等于(): is null comparison redundant when calling base.等于()?

c++ - 限制对 C++ 构造函数和析构函数的访问

字符数组 vector 上的 C++ GCC 4.3.2 错误