C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数_多态父类要用虚函数嘛-程序员宅基地

技术标签: 编程语言  

转自:https://blog.csdn.net/qiurisuixiang/article/details/6926313

 

先来看一段代码:

 
  1. //test.cpp

  2. #include <iostream>

  3. using namespace std;

  4.  
  5. class father

  6. {

  7. public:

  8. father()

  9. {

  10. mPtr = new int;

  11. }

  12.  
  13. ~father()

  14. {

  15. delete mPtr;

  16. cout << "father Destruction......" << endl;

  17. }

  18.  
  19. private:

  20. int *mPtr;

  21. };

  22.  
  23.  
  24. class son:public father

  25. {

  26. public:

  27. son()

  28. {

  29. mStr = new long;

  30. }

  31.  
  32. ~son()

  33. {

  34. delete mStr;

  35. cout << "son Destruction......" << endl;

  36. }

  37.  
  38. private:

  39. long *mStr;

  40. };

  41.  
  42.  
  43. int main()

  44. {

  45. father *p = new son;

  46. delete p;

  47. return 0;

  48. }


 

程序运行截图:

 

从程序的运行结果来看,程序最后只释放了父类的内存,子类的内存并没有释放。则这段程序产生了内存泄露。那是什么原因导致的呢?

在main函数中new出来的是子类son的对象,采用一个父类father的指针来接收,故在析构的时候,编译器因为只知道这个指针是父类的,所以只将父类部分的内存析构了,而不会去析构子类的内存,就造成了内存泄露,那么如何避免这种情况的产生呢?

将父类的析构函数改为虚函数,就可以避免这种情况。

 
  1. //test.cpp

  2. #include <iostream>

  3. using namespace std;

  4.  
  5. class father

  6. {

  7. public:

  8. father()

  9. {

  10. mPtr = new int;

  11. }

  12.  
  13. virtual~father()

  14. {

  15. delete mPtr;

  16. cout << "father Destruction......" << endl;

  17. }

  18.  
  19. private:

  20. int *mPtr;

  21. };

  22.  
  23.  
  24. class son:public father

  25. {

  26. public:

  27. son()

  28. {

  29. mStr = new long;

  30. }

  31.  
  32. ~son()

  33. {

  34. delete mStr;

  35. cout << "son Destruction......" << endl;

  36. }

  37.  
  38. private:

  39. long *mStr;

  40. };

  41.  
  42.  
  43. int main()

  44. {

  45. father *p = new son;

  46. delete p;

  47. return 0;

  48. }


 

程序运行截图:

 

从程序的运行结果可以看出,父类和子类的内存都被析构了。所以在使用多态时一定要将父类的析构函数定义成虚函数,从而避免内存泄露。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gaojing303504/article/details/81410757

智能推荐

Bat语法-程序员宅基地

文章浏览阅读47次。1、 REM REM 是个注释命令一般是用来给程序加上注解的,该命令后的内容在程序执行的时候将不会被显示和执行。 例: REM 你现在看到的就是注解,这一句将不会被执行。 2、 ECHO ECHO 是一个回显命令主要参数有OFF和 ON,一般用ECHO message来显示一个特定的消息 。例: Echo off Rem 以上代表关闭回显即不显示所执行的命令 Echo 这个就是消息。 R...

RCNN,Fast RCNN-程序员宅基地

文章浏览阅读64次。https://towardsdatascience.com/deep-learning-method-for-object-detection-r-cnn-explained-ecdadd751d22

selenium自动登陆校园网wifi(含验证码处理)_校园网自动登录 有验证码-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏8次。 每次登陆川农wifi都要输入密码,账号,验证码。好麻烦有木有,作为一个伪技术工作者,本着装逼的原则,准备自己写个脚本自动登陆wifi,川农校园wifi验证码简单,随便处理下识别率几乎百分百,脚本实用性相当高! 原理:使用自动化测试库selenuim操作谷歌浏览器输入账号,密码,验证码,点击登录。本脚本难点在验证码的识别. 安装和配置selenuim这里有很多坑,这里..._校园网自动登录 有验证码

android 三维软件 cad,CAD实例教程:快速设计呆萌的安卓机器人-程序员宅基地

文章浏览阅读687次。原标题:CAD实例教程:快速设计呆萌的安卓机器人安卓系统的面世给广大数码爱好者提供了新的系统选择,成为了当前常用的智能系统之一,其吉祥物代表——安卓机器人更是深入人心。平时大家常见的平面图样的安卓机器人,科技元素十足,形象也呆萌得让用户感到亲切。我们不妨想象一下,三维立体的安卓机器人是不是更加呆萌更加生动有趣(图1)呢?现在,通过中望3D专业的三维CAD设计软件强大的建模功能,你就可以快速设计出这..._android 引入cad户型图绘制sdk

Ubuntu 删除 pip安装缓存目录_ubuntu pip缓存路径-程序员宅基地

文章浏览阅读1.8k次。```pythonsudo rm -rf ~/.cache/pip_ubuntu pip缓存路径

微信小游戏实战--cocos creator实现wordle游戏(四)_cocos creator 文字游戏教程-程序员宅基地

文章浏览阅读1k次。1、游戏中需要玩家输入一个5个字母的单词,一个“空格”里面输入一个字母。输入完成后点击“ENTER”键进行提交。2、根据游戏规则校验玩家提交的单词。3、若猜中单词则结束游戏,若未猜中单词则在下一排继续输入单词。4、重复1,2,3步骤,若6次机会用完还没猜中即输了。1、“空格”选中效果:这里说的“空格”就是上一篇中制作的prefab(btn_middle),在cocos creator编辑器中已经将btn_middle的背景(子节点Sprite)设置为一个灰色边框,当玩家选中这个btn_middle可以将其背_cocos creator 文字游戏教程

随便推点

office下载_office博客下载-程序员宅基地

文章浏览阅读3k次。https://www.lanzous.com/i1gm3li_office博客下载

OkHttpClient 通过接口传递参数获取json数据并解析_okhttpclient post return-程序员宅基地

文章浏览阅读6.3k次。通过接口传递参数,获取json数据(下例仅传一个参数):1. 添加依赖implementation 'com.zhy:okhttputils:2.6.2'2. 网络请求 /** * 开辟子线程进行联网请求获取JSON数据 * OkHttpClient post方法 * @return */ private void getD..._okhttpclient post return

【hive 日期函数】Hive常用日期函数整理_hive时间函数-程序员宅基地

文章浏览阅读7.9w次,点赞35次,收藏214次。1、to_date:日期时间转日期函数select to_date('2015-04-02 13:34:12');输出:2015-04-022、from_unixtime:转化unix时间戳到当前时区的时间格式select from_unixtime(1323308943,’yyyyMMdd’);输出:201112083、unix_timestamp:获取当前unix时..._hive时间函数

爬虫怎么解决封IP-程序员宅基地

文章浏览阅读2.3k次。爬虫怎么解决封IP

jquery事件(普通事件(单击,双击,隐藏),绑定 自定义)_jquery-min.js 单击事件-程序员宅基地

文章浏览阅读1k次。1.常用事件 (单击事件,双击事件,隐藏事件)//先把jquery.js文件引入进去,然后在引入自己.js文件&amp;lt;script src=&quot;jquery.min.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script src=&quot;eventmethod.js&_jquery-min.js 单击事件

C/C++——各种类型int、long、double、char表示范围(最大最小值)_c++long表示范围十进制-程序员宅基地

文章浏览阅读923次。原贴:http://blog.csdn.net/xuexiacm/article/details/8122267#include #include #include using namespace std; int main() { cout << "type: \t\t" << "************size*_c++long表示范围十进制