浅谈CC内存泄漏及其检测工具.doc

浅谈CC内存泄漏及其检测工具.doc

ID:50907307

大小:47.50 KB

页数:12页

时间:2020-03-15

浅谈CC内存泄漏及其检测工具.doc_第1页
浅谈CC内存泄漏及其检测工具.doc_第2页
浅谈CC内存泄漏及其检测工具.doc_第3页
浅谈CC内存泄漏及其检测工具.doc_第4页
浅谈CC内存泄漏及其检测工具.doc_第5页
资源描述:

《浅谈CC内存泄漏及其检测工具.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、浅谈C/C++内存泄漏及其检测工具2006-04-0309:00作者:出处:温馨小屋责任编辑:方舟  对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题,比如SmartPointer,GarbageCollection等。SmartPointer技术比较成熟,STL中已经包含支持SmartPointer的class,但是它的使用似乎并不广泛,而且它也不能解决所有的问题;GarbageCollection技术在Java中已经比较成熟,但是在c/c++领域的发展并

2、不顺畅,虽然很早就有人思考在C++中也加入GC的支持。现实世界就是这样的,作为一个c/c++程序员,内存泄漏是你心中永远的痛。不过好在现在有许多工具能够帮助我们验证内存泄漏的存在,找出发生问题的代码。  内存泄漏的定义  一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这

3、块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:voidMyFunction(intnSize){ char*p=newchar[nSize]; if(!GetStringFrom(p,nSize)){  MessageBox(“Error”);  return; } …//usingthestringpointedbyp; deletep;}  例一  当函数GetStringFrom()返回零的时候,指针p指向的内存就不会被释放。这是一种常见的发生内存泄漏的情形。程序在入

4、口处分配内存,在出口处释放内存,但是c函数可以在任何地方退出,所以一旦有某个出口处没有释放应该释放的内存,就会发生内存泄漏。  广义的说,内存泄漏不仅仅包含堆内存的泄漏,还包含系统资源的泄漏(resourceleak),比如核心态HANDLE,GDIObject,SOCKET,Interface等,从根本上说这些由操作系统分配的对象也消耗内存,如果这些对象发生泄漏最终也会导致内存的泄漏。而且,某些对象消耗的是核心态内存,这些对象严重泄漏时会导致整个操作系统不稳定。所以相比之下,系统资源的泄漏比堆内存的泄漏更为严重。 

5、 GDIObject的泄漏是一种常见的资源泄漏:voidCMyView::OnPaint(CDC*pDC){ CBitmapbmp; CBitmap*pOldBmp; bmp.LoadBitmap(IDB_MYBMP); pOldBmp=pDC->SelectObject(&bmp); … if(Something()){  return; } pDC->SelectObject(pOldBmp); return;}  例二  当函数Something()返回非零的时候,程序在退出前没有把pOldBmp选回pDC中,

6、这会导致pOldBmp指向的HBITMAP对象发生泄漏。这个程序如果长时间的运行,可能会导致整个系统花屏。这种问题在Win9x下比较容易暴露出来,因为Win9x的GDI堆比Win2k或NT的要小很多。  内存泄漏的发生方式:  以发生的方式来分类,内存泄漏可以分为4类:  1.常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。比如例二,如果Something()函数一直返回True,那么pOldBmp指向的HBITMAP对象总是发生泄漏。  2.偶发性内存泄漏。发生内存泄漏的代码

7、只有在某些特定环境或操作过程下才会发生。比如例二,如果Something()函数只有在特定环境下才返回True,那么pOldBmp指向的HBITMAP对象并不总是发生泄漏。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。  3.一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,但是因为这个类是一个Singleton,所以内存泄漏只会

8、发生一次。另一个例子:char*g_lpszFileName=NULL;voidSetFileName(constchar*lpcszFileName){ if(g_lpszFileName){  free(g_lpszFileName); } g_lpszFileName=strdup(lpcszFileName);}  例三  如果程序在结

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。