多态中基类缺少虚拟析构函数= Ressource leak?

时间:2015-10-31 19:33:50

标签: c++ c++11 memory-management memory-leaks

我们知道如果你打算以多态方式使用它,需要将基类的析构函数指定为虚拟,否则你的程序中可能会有一个ressource泄漏,因为只会调用基类析构函数而不是派生对象析构函数。

我们也知道构造函数/析构函数是纯粹的初始化/未初始化构造,而operator new / operator delete处理内存的分配/取消分配。

在这种情况下,在我的C ++类只包含原始数据成员的情况下,为什么缺少析构函数调用会导致泄漏? 是否更准确地说操作员删除无法取消分配内存,这是否会造成资源泄漏?

编辑:添加一个例子,澄清我的问题。在下面的例子中,派生的析构函数永远不会被调用。这是否意味着derivedInt的内存永远不会被分配?在这种情况下,是因为析构函数无法调用,还是因为运算符delete无法为int分配内存?

class Base
{
    int baseInt;
public:
    Base(){};
    ~Base(){};
};

class Derived : public Base
{
    int derivedInt;
public:
    Derived(){};
    ~Derived(){};
};

int main(int argc, const char * argv[]) {

    Base *pb = new Derived();
    delete pb;

    return 0;
}

1 个答案:

答案 0 :(得分:4)

通过指向base的指针删除对象会调用未定义的行为,除非基类中的析构函数是虚拟的。 Source

这意味着任何事情都可能发生 - 包括内存泄漏。