删除没有虚析构函数的基类指针会导致内存泄漏吗?

时间:2017-03-16 21:25:24

标签: c++ memory-leaks virtual-destructor

以下是解释虚拟析构函数的示例。(请参阅http://www.geeksforgeeks.org/g-fact-37/) 我根据该示例修改了代码,并对内存泄漏提出了疑问。

假设Base类的变量为int num,Derived类的变量为float money。

调用delete base_ptr;时,由于基类的析构函数是虚拟的,因此应首先调用~derived(),然后调用~Base()

我的问题是"功能删除是否足够聪明,以便释放为int num(Base Class)和float money(派生类)分配的内存?

我认为base_ptr是Base *类型的指针,因此它可能只释放Base类所需的内存量。但是,即使base_ptr指向Base类的类型,似乎也会释放int和float。如果是这种情况,如果我们使~Base()成为非虚拟析构函数,是否会导致内存泄漏?使用~Base()的非虚拟析构函数,我们会错过~Derived()的调用。因为没有动态分配"在"基类和派生类似乎~Derived()实际上根本不释放任何内存,delete的函数会释放int numfloat money的内存。

#include <iostream>
using namespace std;

class Base {
public:
    int num;

 Base(int n):num(n){
    cout<<"Base::Constructor\n";
 }
    virtual ~Base(){
    cout<<"Base::Destructor\n";
 }
};

class Derived : public Base {
private:
  float money;
public:
 Derived(int n, float m):Base(n),money(m){
    cout<<"Derived::Constructor\n";
 }
 ~Derived(){
    cout<<"Derived::destructor\n";
 }
};



int main() {
    Base *base_ptr = new Derived(1,200.0);
    delete base_ptr;
    return 0;
}

1 个答案:

答案 0 :(得分:2)

你所描述的是未定义的行为,这意味着任何讨厌的东西都可能出错,而不仅仅是内存泄漏。

但实际上,如果继承不是虚拟的,派生类没有其他基类,派生类没有带有非平凡析构函数的成员,你可能会调用Base::~Base()析构函数,然后operator delete调用了指针。 operator delete(void*)函数只需一个指针并释放它指向的所有内存,因此没有“内存泄漏”。