关于C++内存泄漏的一个经验教训
来源:互联网 发布:gulp压缩混淆加密js 编辑:程序博客网 时间:2024/06/06 05:48
近期写了一段代码,发现有内存泄漏,经多次查找都找不到源点,搞到焦头烂额,最后经同事细心审查,竞是粗心导致的隐藏性错误,为了在以后避免犯同样的错误,有必有记录下来。
在C++中内存管理是很重要的,特别是在new 出内存后,一定要用到相应的delete释放内存,否则就会出现内存泄漏。其实,一般写代码都会有这种意识,但有时自以为是的操作,却不经意引起内存泄漏。
具体情况大体是如下:
在一个类中
H:
class A
{
private:
int* m_pArrData;
public:
A();
~A():
void Function();
}
cpp:
A::A()
{
m_pArrData=NULL;
}
A::~A()
{
delete []m_pArrData;
}
void A::Function()
{
m_pArrData=new int[100];
}
本以为成员变量m_pArrData在类析构函数中释放内存就行了,但实际上这样做是存在内存泄漏风险的,这取决于Function()函数调用次用,如果只调用一次,m_pArrData只分配一次内存,当然在对象析构时可以正确释放内存。但是,当Function()函数要被多次调用,每次调用都用申请内存,然而m_pArrData只能指向最后一次申请的内存地址,对象析构后只会释放最后一次new出来的内存,这样之前申请的内存不但没有释放,而且也没有指引,不能被释放,一直被占用,直到电脑重启才会释放,这样会告成严重的内存泄漏。
所以,当用到要new内存的指针成员变量时,在成员函数中new内存时一定要注意。如上Funtion()函数,可以这样修改:
void A::Function()
{
if(NULL!=m_pArrData)
{
m_pArrData=new [100];
}
}
或当申请空间大小已知时,直接在构造函数中申请空间,在析构函数中释放。
- 关于C++内存泄漏的一个经验教训
- 回复师弟一个关于Java内存泄漏的问题
- 一个简单的内存泄漏检测C工具
- 关于发布的经验教训
- 一个常见的内存泄漏
- 关于Java的内存泄漏
- 关于内存泄漏的概念
- 关于内存泄漏的检测
- 关于内存泄漏的讨论
- 关于CCArmature的内存泄漏
- 关于内存泄漏的问题
- 关于内存泄漏的问题
- 关于内存泄漏的问题
- 关于eclipse开发的经验教训
- IPMI经验教训(C内存泄露教训)
- 关于handler的内存泄漏的总结
- "JAVA内存泄漏"一个永恒的主题
- "JAVA内存泄漏"一个永恒的主题
- strok函数用法
- In App Purchases(IAP 应用程序內购买): 完全攻略
- 线程异常处理
- 转 c# HttpWebRequest与HttpWebResponse请求网页和返回网页教程
- 不会写代码和设备碎片化都不再是问题,Apptimize提供面向Android的A/B测试服务
- 关于C++内存泄漏的一个经验教训
- arcgis10.0安装后打开The license server manager (lmgrd) has not been started yet
- 转: HBase性能调优
- shell 字符串处理汇总
- 打印99乘法表
- No! More!! Long!!! Days... at Work!!!!
- uva 11782 - Optimal Cut(dp)
- 使用spring过程中需要在web.xml中配置的三种情况
- MAKEINTRESOURCE