防御C++内存泄露的闸门
- 格式:pdf
- 大小:108.44 KB
- 文档页数:2
啊叠 翻圃ill Product&Applicatior
工具>>>
防往口c++内存 薹蚕茎兰圣薰 e或lp其.d他l ̄可
泄露的闸门 奏 。
口文/谢宇宁艳文 rid.h的语句放在stdafx.h的包含语句之
后,否则放在最前面。如下是一个示例 程序: 初识Visual Leak Detector 5.它的源代码使用GNU许可发布。 #irlclude<vld.h 灵活自由是C/C++语言的一大特 并有详尽的文档及注释。对于想深入了 voidmain()
色,而这也为c/c++程序员出了一个难 解堆内存管理的读者.这是一个不错的 … 题。当程序越来越复杂时.内存的管理也 选择。 ’
会变得越加复杂,稍有不慎就会出现内 可见,从使用角度来讲,Visual Leak 接下来让我们来演示如何使用visual 存问题。内存泄漏是最常见的内存问题Detector简单易用,对于使用者自己的代Leak Detector检测内存泄漏。下面是一个 之一。内存泄漏如果不是很严重,在短时 码.唯一的修改是增加#include Visual 简单的程序.用new分配了一个int大小 间内对程序不会有太大的影响,这也使Leak Detector的头文件后正常运行自己的 的堆内存.并没有释放。其申请的内存地 得内存泄漏问题有很强的隐蔽性,不容 程序,就可以发现内存问题。从研究的角 址用printf输出到屏幕上。 易被发现。然而不管内存泄漏多么轻微, 度来讲,如果深入Visual Leak Detector源 #include<vld.h> 当程序长时间运行时,其破坏力是惊人 代码,可以学习到堆内存分配与释放的 #include<stdlib.h> . . 辩 .n> 的,从性能下降到内存耗尽,甚至会影响 原理、内存泄漏检测的原理及内存操作 include<stcL ̄o
到其他程序的正常运行。另外内存问题 的常用技巧等。 : “’ 的一个共同特点是,内存问题本身并不 prin2 78 会有很明显的现象,当有异常现象出现 使用Visual Leak Detector(1.O) )
时已时过境迁,其现场已非出现问题时 下面介绍一下如何使用这个小巧的 voidmain()
的现场了,这给调试内存问题带来了很 工具。首先从网站上下载zip z ̄_,,解压之 f() 大的难度。 后得到vId.h,vldapi h.vI d_lib.vldmt ’
Visual Leak Detector是一款用于VI-lib,vldmtdll lib,dbghelp。dll等文件。 编译运行后,在标准输出窗1:3得到: suaI c++的免费的内存泄露检测工具。 将.h文件拷贝到Visual c++的默认in— p=003a89c0 可以在http://www.codeproject.corn/ clude目录下,将I【b文件拷贝到Visual tools/visualleakdetector.asp下载到。相比 c++的默认lib目录下,便安装完成了。 在Visual c++的Output窗I:a得到:
较其它的内存泄露检测工具,它在检测  ̄¥rmo:Visual Leak Detector detected memory leaks! 一一一一一一一一一一Block 57 at 0x003A89C0:4 bytes一一一一一一一一一一 到内存泄漏的同时 还具有如下特点: 一57号块oxoo3A89co地址泄漏了8个字节 1.可以得到内存泄漏点的调用堆栈,宝 ,1dc sole 戛 in.cpp㈩:
甚至还可以得到其所在文件及行号; : 翼 蛊璧 。ns。 、Ⅱ in.cpp :腿in
2.可以得到泄露内存的完整数据; 一双击以引导至对应代码处 f trtm|VCtOOIS|crt_bldtseIf x86tCrttSrclCrtexe.c r58 6, 3.可以设置内存泄露报告的级别; 锄jn 蹦:a曲 一 …一. 。 .... .._ . f:\rtm\vctocls\crt_bld\self_x86\crt\src\crtexe.c(403):mainCRTStartup 4.它是一个已经打包的llb,使用时0x7CSI6D4F《n1eand1im咖fEt)E 眦available):Regist 呲tFo咖ltIdle 无须编译它的源代码。而对于使用者自 慧泄漏内存的 0.x.…1234…567…8..
己的V1码,上Le 要做上小的.动; Visuel Leak—Detector ̄.etected一1memory.1ea—k.
126-童岛员 维普资讯 http://www.cqvip.com 第二行表示57号块有4字节的内存 呢7 Windows提供了分配钩子[allocation 有未释放之堆内存.则必为内存泄漏。
泄漏.地址为0x003A89C0.根据程序控hooks)来监视调试堆内存的分配。它是一 分配的堆内存是通过一个链表来组
制台的输出 可以知道.该地址为指针P。 个用户定义的回调函数.在每次从调试 织的.检查内存泄漏则是检查此链表。但
程序的第7行.f【)函数里.在该地址处分 堆分配内存之前被调用。在初始化时. 是Windows没有提供方法来访问这个链
配了4字节的堆内存空间.并赋值为 Visual Leak Detector使用一CrtSetAIIocHook 表。Visual Leak Detector使用了一个小技
0xl2345678,这样在报告中.我们看到了 注册这个钩子函数.这样就可以监视从 巧来得到它。首先在堆上申请一块临时
这4字节同样的内容。 此之后所有的堆内存分配了。 内存,则该内存的地址可以转换成指向
可以看出.对于每一个内存泄漏,这 如何保证在Visual Leak Detector初始 一个CrtMemBIockHeader结构 在此结构 个报告列出了它的泄漏点、长度、分配该 化之前没有堆内存分配呢7全局变量是 中就可以获得这个链表。
内存时的调用堆栈 和泄露内存的内容 在程序启动时就初始化的,如果将Visual
1分别以16进制和文本格式列出)。双击该Leak Detector作为一个全局变量.就可以 报告生成 堆栈报告的某一行.会自动在代码编辑器 随程序一起启动。但是C/C++并没有约 前面讲TVisual Leak Detector ̄R何检
中跳到其所指文件的对应行。这些信息对 定全局变量之间的初始化顺序.如果其 测、记录内存泄漏及其调用堆栈。但是如 于我们查找内存泄露将有很大的帮助。 它全局变量的构造函数中有堆内存分配. 果要使这个信息对程序员有用的话.必
则可能无法检测到。 须转换成可读的形式。Visual Leak Detector 工作原理 使用SymGetL ineF romAdd r64()及 下面让我们来看一下该工具的工作原 记录内存分配 SymFromAddr()生成可读的报告。
理。在这之前,我们先来看一下Vi sual 一个分配钩子函数需要具有如下的 概括讲来,Visual Leak Detector的工
c++内置的内存泄漏检测工具是如何工作 形式: 作分为3步,首先在初始化时注册一个钩 的。Visual C++内置的工具CRT Debug Heap int YourAIIocHook(int alIocType.void 子函数:然后在内存分配时该钩子函数
工作原理很简单。在使用Debug版的realIoc *userData,slze_t size,int blockIype,long 被调用以记录当时的现场:最后检查堆
分配内存时,malloc会在内存块的头中记 requestNumbe r,const unsigned cha r 内存分配链表以确定是否存在内存泄漏
录分配该内存的文件名及行号。当程序退 *illename,int lineNumber): 并将泄漏内存的现场转换成可读的形式 出时CRT会在main()函数返IAi2_后做一些 就像前面说的,它在Visual Leak De一 输出。
清理工作,这个时候来检查调试堆内存, rector初始化时被注册,每次从调试堆分 如果仍然有内存没有被释放,则一定是存 配内存之前被调用。这个函数需要处理 总结
在内存泄漏。从这些没有被释放的内存块 的事情是记录下此时的调用堆栈和此次 在使用上,Visual Leak Detector简
的头中,就可以获得文件名及行号。 堆内存分配的唯一标识:requestNumber。 单方便,结果报告一目了然。在原理
这种静态的方法可以检测出内存泄漏 得到当前的堆栈的二进制表示并不 上,Visual Leak Detecto r针对内存泄
及其泄漏点的文件名和行号,但是并不 是一件很复杂的事情,但是因为不同体 漏问题的特点,可谓对症下药——内存
知道泄漏究竟是如何发生的,并不知道 系结构、不同编译器、不同的函数调用约 泄漏不是难于发现吗7那就把每次内 该内存分配语句是如何被执行到的。要 定所产生的堆栈内容略有不同,要解释 存分配都记录下来,程序退出时算总 想了解这些,就必须要对程序的内存分 堆栈并得到整个函数调用过程略显复杂。 账;内存泄漏现象出现时不是已时过
配过程进行动态跟踪。Visual Leak Detector 不过Windows提供一个StackWalk64函 境迁,并非当时泄漏点的现场了吗7
就是这样做的。它在每次内存分配时将 数,可以获得堆栈的内容。 那就把现场也记录下来.清清楚楚地
其上下文记录下来.当程序退出时,对于 告诉使用者那块泄漏的内存就是在哪 检测到的内存泄漏,查找其记录下来的 检测内存泄露 个调用过程中泄漏掉的。
上下文信息,并将其转换成报告输出。 前面提到了Vi sIJal c++内置的内存泄 Visual Leak Detector是一个简单易用 漏检测工具的工作原理。与该原理相同, 的内存泄漏检测工具。现在最新的版本是
初始化 因为全局变量以构造的相反顺序析构, 1 9a,它采用了新的检测机制,并在功能 Visual Leak Detector要记录每一次的 在Visual Leak Detector析构时.几乎所有 上有了很多改进。读者不妨体验一下。一
内存分配,而它是如何监视内存分配的 日习具他耍重 s已经 构,此盯如果 然 一责任编辑:妣蠕 (1lj@csdn.net)
-Programmer
127 维普资讯 http://www.cqvip.com