内存泄露导致的原因总结

最近再查内存泄露,总结一下自己发现的问题:

1.new的东西一定要delete,delete后要将指针指到NULL.
且不能有隐式泄露,即中间报错,或者函数return退出时都要释放
比如:

CFont  My_Font=new CFont;
delete My_Font;
My_Font=NULL;
View Code


2.new出的数组也要释放

1 char *BlobMsg = new char[lengthRes];
2 BlobMsg= (char*)(record[2]);
3 
4 delete[] BlobMsg;//删除数组时需要delete[],不能只是delete
5 BlobMsg=NULL;
View Code


3.文件流打开必须要相应关闭

1 outStream.open
2 outStream.close();
View Code


4.将指针作为参数传入线程或者函数时,这个指针需要在线程中释放

创建、传入:        

1 threadInfoMain* InfoMain=new threadInfoMain;
2 InfoMain->mParams=vec.at(i).c_str();
3 InfoMain->pMultiThread=this;
4 InfoMain->mfileName.Format("%s",FullPath.c_str());
5 InfoMain->clientIP.Format("%s", inet_ntoa(name.sin_addr));
6 InfoMain->sendsock=sock;
7                                         
8 
9 pThread=AfxBeginThread(ThreadFuncServerMain,InfoMain);
View Code


在线程中释放:

1 threadInfoMain* pInfo=(threadInfoMain*)lpParam;
2 delete lpParam;
3 lpParam = NULL;
View Code


5.Mysq查询结果数据集一定要释放

1 MYSQL_RES * results;
2 mysql_free_result(results); 
View Code

6.CLISTCTRL在删除原有数据时,需先删除所有显示内容,再删除所有字段

1 clist.DeleteAllItems();
2 
3 while ( clist.DeleteColumn (0));
View Code

7.vector存入数据时,clear并不能释放数据所占内存,需要重新定义个局部vector,两个互相调换一下

1  vector<CPersonIOData> m_PersonIOData;//全局
2     if(m_PersonIOData.size()!=0)
3     {
4         vector<CPersonIOData> Stmp;
5         //释放vector占用的空间
6         m_PersonIOData.swap(Stmp);
7     }
View Code

8.函数不能返回指向栈内存的指针,因为栈在函数结束时变量就会释放,
详情可以参考这个:http://blog.csdn.net/jackystudio/article/details/11523353

这样就是错误的:

1 char* returnValue()  
2 {  
3     char str[]="HelloJacky";  
4     return str;  
5 }  
View Code


目前遇到的问题就这么多,我用了一款测试内存泄露的工具,朋友推荐的,叫AQTime,
需要到网上去注册并下载最新版本,申请试用,试用只有14天,他能很快的指出我的软件的内存泄露。
14天用完以后,我就只能看任务管理器中的涨幅了,发现每次触发一个事件,就涨,再次触发,还涨,

内存并没有下降,就是有内存泄露了,那么就仔细查看代码,看哪出可能发生内存泄露,或者屏蔽部分

代码,看看具体那块泄露。

原文地址:https://www.cnblogs.com/wangyuanf/p/3598157.html