0
点赞
收藏
分享

微信扫一扫

虚析构函数为什么会出现内存泄漏

林肯公园_97cc 2022-02-05 阅读 110
c++

我们先看一段代码

#include <iostream>
using namespace std; 

class Base {
public:
    ~Base(); //不是虚函数
};
Base::~Base() {
    cout<< "Base destructor" << endl;
 }


class Derived: public Base{
public:
    Derived();
    ~Derived(); //不是虚函数
private:
    int *p;
};

void fun(Base *b){
    delete b;  //只会调用Base对象的析构函数
}

int main(){
    Base *a=new Derived();
    fun(a);
    return 0;
}

当执行主函数中第一条语句时,定义a为指向Derived类的动态内存,此时则会调用Derived类的构造函数,开辟内存空间。而在执行fun函数时,由于其参数为Base类指针,且基类析构函数并不是虚函数,则只会调用基类的析构函数。程序执行后结果如下。

函数执行完后,因Derived类的析构函数没有调用,空间没有被释放,造成内存泄漏。

为什么基类析构函数不是虚函数时,只能根据形参表的类型确定析构函数。是因为虚函数在编译时不确定执行哪一条函数体,而是在运行时确定。根据调用对象的指针是哪个类来确定调用哪个类的虚函数。

举报

相关推荐

0 条评论