c/c++语言开发共享C++分析如何用虚析构与纯虚析构处理内存泄漏

一、问题引入使用多态时,如果有一些子类的成员开辟在堆区,那么在父类执行完毕释放后,没有办法去释放子类的内存,这样会导致内存的泄漏。如下代码段。如果没有堆区的数据,可以不写虚析构或纯虚析构。#inclu

一、问题引入

使用多态时,如果有一些子类的成员开辟在堆区,那么在父类执行完毕释放后,没有办法去释放子类的内存,这样会导致内存的泄漏。如下代码段。

如果没有堆区的数据,可以不写虚析构或纯虚析构。

#include <iostream>  #include <string>  using namespace std;  class animal{    public:      animal(){          cout<<"animal-构造"<<endl;      }        ~animal(){          cout<<"animal-析构"<<endl;      }      virtual void run()=0;  //纯虚函数无需实现,只需声明  };  class cat:public animal{    public:    string *s_name;    cat(string name){        s_name = new string(name);//在堆区创建内存        cout<<"cat-构造"<<endl;    }    void run()    {        cout<<*s_name<<"->"<<"cat-run"<<endl;    }    ~cat(){        cout<<"cat-析构"<<endl;        if(s_name!=null){            delete s_name;            s_name=null;        }    }  };  int main()  {      animal *a;      a = new cat("tom");      a->run();      delete a;   //父类指针析构的时候,不会调用子类析构函数      return 0;  }

运行结果:

C++分析如何用虚析构与纯虚析构处理内存泄漏

结果可以看到都有父类和子类的构造,虽然在主函数中delete 父类,但最终只有父类的析构函数,此时子类在堆区创建的s_name并没有得到释放,导致内存泄漏。

以上的问题我们引入虚析构和纯虚析构来解决——父类指针释放子类对象时不干净的问题

二、利用虚析构解决

虚析构只需要在析构函数前加关键字 virrtual 即可,再观察结果,可以看到父类和子类的都执行了析构函数,而子类中在堆区创建的数据也被释放干净,这是最终的结果!

   virtual ~animal(){          cout<<"animal析构"<<endl;      }

C++分析如何用虚析构与纯虚析构处理内存泄漏

三、利用纯虚析构解决

纯虚析构格式如下,和纯虚函数有点类似,但需要有具体的声明和具体的实现。纯虚析构需要在类外实现.

class animal{    public:      animal(){          cout<<"animal-构造"<<endl;      }      //虚析构       /*virtual ~animal(){          cout<<"animal析构"<<endl;      }*/      //纯虚析构      virtual ~animal()=0;      virtual void run()=0;  //纯虚函数无需实现,只需声明  };  //需要有声明,也需要有实现  animal::~animal(){      cout<<"纯虚析构"<<endl;  }

结果如下,和虚析构有相同的作用

C++分析如何用虚析构与纯虚析构处理内存泄漏

四、总结

虚析构和纯虚析构

相同点: 都可以解决父类指针释放子类对象,都需要有具体的实现

不同点: 纯虚析构属于抽象类,无法实例化对象

到此这篇关于c++分析如何用虚析构与纯虚析构处理内存泄漏的文章就介绍到这了,更多相关c++内存泄漏内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C++分析如何用虚析构与纯虚析构处理内存泄漏,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1236943.html

(0)
上一篇 2022年9月7日
下一篇 2022年9月7日

精彩推荐