欢迎来到天天文库
浏览记录
ID:20595612
大小:56.50 KB
页数:12页
时间:2018-10-14
《vc使用crt调试功能来检测内存泄漏》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、VC使用CRT调试功能来检测内存泄漏C/C++编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么C/C++应用程序正好印证了这句话。在C/C++应用程序开发过程中,动态分配的内存处理不当是最常见的问题。其中,最难捉摸也最难检测的错误之一就是内存泄漏,即未能正确释放以前分配的内存的错误。偶尔发生的少量内存泄漏可能不会引起我们的注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种各样的征兆:从性能不良(并且逐渐降低)到内存完全耗尽。更糟的是,泄漏的程序可能会用掉太多内存,导致另外一个程序垮掉,而使用户无从查找问题的真正根源
2、。此外,即使无害的内存泄漏也可能殃及池鱼。 幸运的是,VisualStudio调试器和C运行时(CRT)库为我们提供了检测和识别内存泄漏的有效方法。下面请和我一起分享收获——如何使用CRT调试功能来检测内存泄漏?一、如何启用内存泄漏检测机制 VC++IDE的默认状态是没有启用内存泄漏检测机制的,也就是说即使某段代码有内存泄漏,调试会话的Output窗口的Debug页不会输出有关内存泄漏信息。你必须设定两个最基本的机关来启用内存泄漏检测机制。 一是使用调试堆函数:#define_CRTDBG_MAP_ALLOC#include#include
3、 注意:#include语句的顺序。如果更改此顺序,所使用的函数可能无法正确工作。 通过包含crtdbg.h头文件,可以将malloc和free函数映射到其“调试”版本_malloc_dbg和_free_dbg,这些函数会跟踪内存分配和释放。此映射只在调试(Debug)版本(也就是要定义_DEBUG)中有效。发行版本(Release)使用普通的malloc和free函数。#define语句将CRT堆函数的基础版本映射到对应的“调试”版本。该语句不是必须的,但如果没有该语句,那么有关内存泄漏的信息会不全。 二是在需要检测内存泄漏的地方添加下面这条语句来输出内存泄漏信息:_CrtDu
4、mpMemoryLeaks(); 当在调试器下运行程序时,_CrtDumpMemoryLeaks将在Output窗口的Debug页中显示内存泄漏信息。比如:Detectedmemoryleaks!Dumpingobjects->C:Tempmemleakmemleak.cpp(15):{45}normalblockat0x00441BA0,2byteslong.Data:4142c:programfilesmicrosoftvisualstudiovc98includecrtdbg.h(552):{44}normalblockat0x00441BD0,33by
5、teslong.Data:004300CDCDCDCDCDCDCDCDCDCDCDCDCDc:programfilesmicrosoftvisualstudiovc98includecrtdbg.h(552):{43}normalblockat0x00441C20,40byteslong.Data:08024300160000000000000000000000Objectdumpcomplete. 如果不使用#define_CRTDBG_MAP_ALLOC语句,内存泄漏的输出是这样的:Detectedmemoryleaks!Dumpingobjects->{4
6、5}normalblockat0x00441BA0,2byteslong.Data:4142{44}normalblockat0x00441BD0,33byteslong.Data:004300CDCDCDCDCDCDCDCDCDCDCDCDCD{43}normalblockat0x00441C20,40byteslong.Data:C0014300160000000000000000000000Objectdumpcomplete. 根据这段输出信息,你无法知道在哪个源程序文件里发生了内存泄漏。下面我们来研究一下输出信息的格式。第一行和第二行没有什么可说的,从第
7、三行开始:xx}:花括弧内的数字是内存分配序号,本文例子中是{45},{44},{43};block:内存块的类型,常用的有三种:normal(普通)、client(客户端)或CRT(运行时);本文例子中是:normalblock;用十六进制格式表示的内存位置,如:at0x00441BA0等;以字节为单位表示的内存块的大小,如:32byteslong;前16字节的内容(也是用十六进制格式表示),如:Data:4142等; 仔细观察不难发现,如
此文档下载收益归作者所有