【问题标题】:Virtual destructor missing for base class in polymorphism = Ressource leak?多态性中基类缺少虚拟析构函数=资源泄漏?
【发布时间】:2016-02-01 01:05:33
【问题描述】:

我们知道,如果您打算多态地使用基类的析构函数,则需要将其指定为虚拟,否则您的程序中可能会出现资源泄漏,因为只会调用基类析构函数而不是派生对象析构函数。

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

在这种情况下,在我的 C++ 类仅包含原始数据成员的情况下,为什么缺少析构函数调用会导致泄漏? 更准确的说法是操作符 delete 不能取消分配内存,这就是造成资源泄漏的原因吗?

编辑:添加一个示例,以澄清我的问题。在以下情况下,派生的析构函数永远不会被调用。这是否意味着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;
}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 2012-09-02
      • 2015-06-04
      • 2015-10-18
      • 2014-02-23
      • 2012-02-03
      • 2012-06-26
      • 2011-03-21
      • 2019-04-20
      相关资源
      最近更新 更多