c++中虚析构函数的作用是什么?

  析构函数是为了在对象不被使用后释放它的资源,虚函数是为了实现多态。那么,把析构函数声明为virtual有什么作用呢? 请看下面代码:

<span style="font-size:18px;">#include <iostream>  using namespace std;  class Base
{
public:  Base(){ }           //Base的构造函数  ~Base()             //Base的析构函数  {  cout<<"output from the destructor of class Base"<<endl;  }  virtual void Dosomething()  {  cout<<"do something in class Base"<<endl;  }
};  class Derived : public Base
{
public:  Derived(){ }        //Derived的构造函数  ~Derived()          //Derived的析构函数  {  cout<<"output from the destructor of class Derived"<<endl;  }  void Dosomething()  {  cout<<"do something in class Derived"<<endl;  }
};  int main()
{  Derived *pt1 = new Derived();  pt1->Dosomething();  delete pt1;  Base *pt2 = new Derived();  pt2->Dosomething();  delete pt2;  return 0;
}</span

程序输出:

<span style="font-size:18px;">do something in class Derived
output from the destructor of class Derived
output from the destructor of class Base
do something in class Derived
output from the destructor of class Base</span>

代码37行可以正常释放pt1的资源,但是代码41行并没有正常释放pt2的资源,从结果看,Derived类的析构函数并没有被调用。通常情况下,类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。原因是指针pt2是Base类型的指针,释放pt2时只进行Base类的析构函数。在代码第9行加上virtual关键字后

    do something in class Derived  output from the destructor of class Derived  output from the destructor of class Base  do something in class Derived  output from the destructor of class Derived  output from the destructor of class Base  

此时释放指针pt2时,由于Base的析构函数是virtual的,就会先找到并执行Derived类的析构函数,然后执行Base类的析构函数,资源正常释放,避免了内存泄漏。

  因此,只有当一个类被用来作为基类的时候,才会把析构函数写成虚析构函数。

c/c++整理--析构函数相关推荐

  1. php mysql技术笔试题_PHP面试笔试题--选择题部分(最新整理)

    <PHP面试笔试题--选择题部分(最新整理)>由会员分享,可在线阅读,更多相关<PHP面试笔试题--选择题部分(最新整理)(7页珍藏版)>请在人人文库网上搜索. 1.1. 以下 ...

  2. 2010 .NET面试题整理之基础篇

    2010 .NET面试题整理之基础篇 zhuan 开篇语:对于已有工作经验的朋友,也许面试题已显得不怎么重要,但是如果你应聘的还仅仅是个普通的程序员,相信在很多的公司都还是会先拿出一套面试题,可能对整 ...

  3. python基础知识资料-python基础知识整理(值得收藏)

    近些年python语言非常流行,许多开发者都会学习一些python相关知识,本文为大家整理了python的一些基础知识,希望对大家有一定的帮助. 注:下文Python代指Python3. 基本信息和J ...

  4. 后台接收数组_「面试必备」最新整理出的腾讯C++后台开发面试笔记

    文章是由笔试面试腾讯笔记整理而来,主要是针对面试的C++后台开发岗位,涵盖了大部分C++后台开发相关可能会考察和被问到的技术点. 自认为这篇笔记是比较全面的总结,不管你是已经工作准备参加社招,还是在校 ...

  5. 100道Java基础面试题收集整理(附答案)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  6. .NET技术学习目录整理

    .NET知识体系是个很庞大的体系,在此很难全部罗列,MSDN是全,基本上,下面所罗列的知识在MSDN中都可以找到. 这些知识看起来很全了,如果看看MSDN,似乎还差的远,就像某些达人说的,现在开发的应 ...

  7. Delphi 关键字详解[整理于 橙子 的帖子]

    Delphi 关键字详解[整理于 "橙子" 的帖子] absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: string[3 ...

  8. c++基础入门(根据浙大翁恺老师视频整理)

    把以前的笔记搬上来一下 根据浙大翁恺老师视频整理 https://www.bilibili.com/video/BV1yQ4y1A7ts?p=2 01第一个c++程序 02什么是对象 通过操作访问数据 ...

  9. C++ 基础概念、语法和易错点整理

    目录 基础知识 构造函数与析构函数 虚函数 继承 单例模式 重载.隐藏和重写(覆盖) vector 扩容机制应注意的问题 STL 迭代器 前言 快秋招了,专门用一篇博客整理一下 C++ 的一些基础概念 ...

最新文章

  1. C#连接sqlserver windows 和 sqlserver 身份验证的两种连接字符串
  2. 意料之外,情理之中,Spring.NET 3.0 版本发布-
  3. apache camel_Apache Camel –从头开始开发应用程序(第1部分/第2部分)
  4. 用c语言编程减法计算,求用C编个大数加减法运算程序
  5. nginx缓存HtmL文件,Nginx在缓存的html文件上返回404
  6. Angular之ngx-permissions的控制视图访问
  7. android下拉弹性gif,android-pulltorefresh 下拉加载中使用gif动图
  8. spring的三种启动方式
  9. 力扣——LCP 37. 最小矩形面积(困难)
  10. 葡萄品质无损检测技术的研究进展
  11. paip.软件版本完善计划C426fromVC423
  12. Shiro面试题总结
  13. Java开源企业协同办公项目:O2OA如何集成WPS
  14. define宏定义函数及用模板函数实现同样的功能
  15. 安兔兔排行榜提取和搜索
  16. 解决Unable to find the module utility `modprobe`错误
  17. 一文了解Web Worker
  18. [Java]窗口的跳转
  19. STC15L2K32S2芯片介绍与实验板原理图分析
  20. 雷达感应人体存在,雷达感应原理

热门文章

  1. linux的du使用方法
  2. 实现一个简单的前端水印
  3. 稳定和性能如何兼顾?58大数据平台的技术演进与实践
  4. DOS窗口的编码页从UTF-8调回GBK
  5. 注册Tomcat服务为系统服务
  6. mysql从入门到精通之数据库基本概念理解
  7. 主流虚拟化产品对比列表01
  8. 关系与普通表的术语比较
  9. 交换机的工作转发原理
  10. esrgan_ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks【阅读笔记】