非虚拟的简单析构函数+继承

Tho*_*ing 2 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;
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 9

"泄漏记忆"?你为什么要特别谈论泄漏记忆?

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

PS我知道那里有一个流行的都市传奇,在没有虚拟析构函数的情况下执行多态破坏"可能会泄漏内存".我不知道是谁发明了那些废话以及为什么他们决定使用"泄漏记忆"作为可能发生的事情的主要场景.实际上,这种情况下的行为与"泄漏记忆"完全无关.行为简直是未定义的.

从实际的角度来看,在你的特定情况下很明显,没有真正的机会让你的析构函数auto_ptr被调用,所以它拥有的内存auto_ptr肯定会被泄露.但同样,这是代码中最少的问题.

  • 特别是 - 硬盘格式化!这甚至发生在我身上!(+ 1,顺便说一句) (2认同)