最近再查内存泄露,总结一下自己发现的问题:
1.new的东西一定要delete,delete后要将指针指到NULL.
且不能有隐式泄露,即中间报错,或者函数return退出时都要释放
比如:
CFont My_Font=new CFont; delete My_Font; My_Font=NULL;
2.new出的数组也要释放
1 char *BlobMsg = new char[lengthRes]; 2 BlobMsg= (char*)(record[2]); 3 4 delete[] BlobMsg;//删除数组时需要delete[],不能只是delete 5 BlobMsg=NULL;
3.文件流打开必须要相应关闭
1 outStream.open 2 outStream.close();
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);
在线程中释放:
1 threadInfoMain* pInfo=(threadInfoMain*)lpParam; 2 delete lpParam; 3 lpParam = NULL;
5.Mysq查询结果数据集一定要释放
1 MYSQL_RES * results; 2 mysql_free_result(results);
6.CLISTCTRL在删除原有数据时,需先删除所有显示内容,再删除所有字段
1 clist.DeleteAllItems(); 2 3 while ( clist.DeleteColumn (0));
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 }
8.函数不能返回指向栈内存的指针,因为栈在函数结束时变量就会释放,
详情可以参考这个:http://blog.csdn.net/jackystudio/article/details/11523353
这样就是错误的:
1 char* returnValue() 2 { 3 char str[]="HelloJacky"; 4 return str; 5 }
目前遇到的问题就这么多,我用了一款测试内存泄露的工具,朋友推荐的,叫AQTime,
需要到网上去注册并下载最新版本,申请试用,试用只有14天,他能很快的指出我的软件的内存泄露。
14天用完以后,我就只能看任务管理器中的涨幅了,发现每次触发一个事件,就涨,再次触发,还涨,
内存并没有下降,就是有内存泄露了,那么就仔细查看代码,看哪出可能发生内存泄露,或者屏蔽部分
代码,看看具体那块泄露。