温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++怎么用虚析构与纯虚析构处理内存泄漏

发布时间:2022-08-25 10:33:07 来源:亿速云 阅读:131 作者:iii 栏目:开发技术

本文小编为大家详细介绍“C++怎么用虚析构与纯虚析构处理内存泄漏”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么用虚析构与纯虚析构处理内存泄漏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、问题引入

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

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

#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++怎么用虚析构与纯虚析构处理内存泄漏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

向AI问一下细节
推荐阅读:
  1. ospf虚链路
  2. 虚连接配置

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI