C++中析构函数需要定义成虚函数的原因
来源:互联网 发布:mac 终端设置时间 编辑:程序博客网 时间:2024/06/05 01:53
标准C++建议将虚构函数定义成虚函数,下面就来探讨这个问题。
很显然,上述的程序有内存泄漏。这是因为当删除pCBase时,它只调用了Base的析构函数而没调用BaseEx的析构函数,所以导致内存泄漏。再看下例:
解决以上问题的方法很简单,就是使基类Cfunction的析构函数为虚函数就可以了。
#include <iostream>class Base{public: Base() {data = new char[64]; } ~Base(){delete [] data;}private: char *data;};class BaseEx: public Base{public: BaseEx(){m_data = new char[64];} ~BaseEx(){delete [] m_data;}private: char *m_data;};void main(){Base*pCBase = new BaseEx;delete pCBase ;}
很显然,上述的程序有内存泄漏。这是因为当删除pCBase时,它只调用了Base的析构函数而没调用BaseEx的析构函数,所以导致内存泄漏。再看下例:
#include <iostream>class CBase{public: CBase(){data = new char[64];} ~CBase(){delete [] data;}private: char *data;};class CFunction{public: CFunction(){}; ~CFunction(){};};class CFunctionEx : public CFunction{public: CFunctionEx(){}; ~CFunctionEx(){};private: CBase m_cbase;};void main(){CFunction *pCFun = new CFunctionEx;delete pCFun;}这里CfunctionEx和Cfunction中本身并没有分配内存,应该不会有内存泄漏。和上例一样当删除pCFun时,它只调用了Cfunction的析构函数而没调用CfunctionEx的析构函数,但CfunctionEx本身并没分配内存。所以发生内存泄露的地方是m_cbase,因为它是CBase的实例且是CfunctionEx成员变量,当CfunctionEx的析构函数没有被调用时,当然m_cbase的析构函数也没有被调用,所以CBase中分配的内存被泄漏。
解决以上问题的方法很简单,就是使基类Cfunction的析构函数为虚函数就可以了。
这样就得出一个结论,当你的基类的析构函数不为虚的话,其子类中所有的成员变量的类中分配的内存也将可能泄漏。
也可以这么说,基类的指针声明为虚函数,那么如果用一个基类的指针指向子类的对象,在用delete这个基类指针指向的对象的时候,会调用子类的析构函数。而如果不这么声明的话,当用基类指针保存子类对象,释放基类指针所指对象的时候,不会调用子类的析构函数,出现内存泄露
这里说的可能是因为,如果程序中没有以上示例类似写法(指用基类指针指向子类实例,虚函数是C++的精华,很少有人不用的,由其是在大中型软件项目中),就不会出现本文所说的内存泄漏。看来在基类中使析构函数为虚函数是如此的重要。所以强烈建议在基类中把析构函数声明为虚函数,但是只有你写的类并不做为基类时例外。
0 0
- C++中析构函数需要定义成虚函数的原因
- C++中析构函数定义成虚函数的原因
- C++中析构函数定义成虚函数的原因
- C#&&Java-----C#中和Java中把主函数定义成静态成员函数的原因
- selelct函数的需要原因
- 汇编程序调用C函数需要设置栈的原因
- C++的析构函数需要定义为虚函数
- 多态类基类析构函数定义为虚函数原因
- C++将析构函数定义成virtual的真正原因
- C++将析构函数定义成virtual的原因
- C++:什么情况下需要将析构函数定义为虚函数?
- C/C++—— C++中定义虚析构函数的原因
- 嵌入式需要了解的定义函数
- C++ 虚函数是否需要定义?
- 析构函数定义为虚函数原因
- 析构函数定义为虚函数原因
- 析构函数定义为虚函数原因
- 析构函数定义为虚函数原因
- android自定义view-绘制顺序及相关原理
- Spring3.0和3.1新定时任务节点
- [转]linux进程的最大文件数
- TabHost的使用
- jpa 由数据库反向生成实体
- C++中析构函数需要定义成虚函数的原因
- 圣诞节“马上有对象” 男士求爱成功率高达55%
- weak alias
- 从QQ网站中提取的纯JS省市区三级联动
- 黑马程序员_HTML中CSS使用的几种方法
- Oracle导出存储过程
- 分享SEO博客推广的五年夜体点
- 网站记录日志类
- java设计模式之观察者模式