C++ rtmp livestream 流媒体

海阔天空 张翼飞翔

我的学习笔记。--我喜欢这里,因为这里安静,无广告骚扰。
随笔 - 82, 文章 - 2, 评论 - 126, 引用 - 0
数据加载中……

虚析构方法是如何防止内存泄露的

使用虚函数,我们可以灵活的进行动态绑定,我们把父类的指针指向子类。调用这种指针的函数时候,如果该函数是虚函数,那么会执行子类的函数,否则会执行父类的函数,这点在析构方法中控制内存泄露显得很重要。

#include <iostream.h> 
class CBase 

public
CBase() 

data 
= new char[64]; 
}

~CBase() 

delete [] data; 
}

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的析构函数为虚函数就可以了。
这样就得出一个结论,当你的基类的析构函数不为虚的话,
1 其子类中所分配的内存将可能泄漏。
2 其子类中所有的成员变量的类中分配的内存也将可能泄漏。
第二点非常重要,因为很容易被遗漏。我就是为此这才写此文。
这里说的可能是因为,如果程序中没有以上示例类似写法(指用基类指针指向子类实例裕,虚函数是C++的精华,很少有人不用的,由其是在大中型软件项目中),就不会出现本文所说的内存泄漏。看来在基类中使析构函数为虚函数是如此的重要。所以强烈建议在基类中把析构函数声明为虚函数,但是只有你写的类并不做为基类时例外。

posted on 2008-04-17 11:20 ZhangEF 阅读(271) 评论(0)  编辑  收藏 所属分类: C/C++