Visual Studio内存泄露检测工具
来源:互联网 发布:手机淘宝怎样申请小号 编辑:程序博客网 时间:2024/05/19 03:45
使用简介
在写程序的过程中,难免会遇到内存泄露的时候,这个时候如果手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是很耗时间和精力的。诚然,我们可以借助一些工具,而且我们还会惊奇地发现这些工具很有用(比如Intel的内存泄露检测工具),但是因为往往这些工具安装比较麻烦,而我们写的程序又不是很大,所以我们或许可以找个更小巧的方法。微软就提供了这样的方法,我们只需要在程序中加入几行代码,就可以发现内存泄露的问题,然后我们就可以定位内存泄露了(自己用几行代码就可以实现,神奇!)。那么如何实现了,主要的几个函数现先列举一下:_CrtDumpMemoryLeaks,_CrtMemCheckpoint,_CrtMemDifference
- CrtDumpMemoryLeaks :当前所有没有销毁的对象(没有delete和free),默认情况下输出到调试窗口
- _CrtMemCheckpoint:保存当前所有没有销毁的对象的状态
- _CrtMemDifference:比较两个_CrtMemCheckpoint保存的状态,返回差异值
使用示例
- 启用内存泄露调试支持
#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>
其中#define 语句将 CRT 堆函数的基础版本映射到对应的调试版本。 如果省略 #define 语句,内存泄漏转储将有所简化。
使用这些语句启用调试堆函数之后,可以在某个应用程序退出点之前设置一个对 _CrtDumpMemoryLeaks 的调用,以便在应用程序退出时显示内存泄漏报告:_CrtDumpMemoryLeaks();如果要为程序添加退出点时检测内存泄露,则可以通过设置调试选项来设置,而不需要在每个退出点自己添加函数_CrtDumpMemoryLeaks的调用:_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );默认情况下,输出的调试信息会在调试窗口,当然,你可以通过_CrtSetReportMode等来自定义输出位置。_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDERR );为了使得输出的内存泄露信息中包含源代码的文件和行信息,还需要定义一些额外的东西,以下是我封装好的头文件,在每个需要检测内存泄露的文件中包含该头文件即可:#ifndef __MEM_LEAN_DETECT_H__#define __MEM_LEAN_DETECT_H__#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)#endif其中 #define _CRTDBG_MAP_ALLOC 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。并非绝对需要该语句,但如果没有该语句,内存泄漏转储包含的有用信息将较少。而 #define new 利用了在源代码中获取代码所在文件及行数的方法用以输出内存泄露源所在的代码位置。
- 比较内存泄露状态
定位内存泄漏的另一种技术涉及在关键点对应用程序的内存状态拍快照。 若要为应用程序中给定点的内存状态拍快照,创建 _CrtMemState 结构,将它传递给 _CrtMemCheckpoint 函数:_CrtMemState s1;_CrtMemCheckpoint( &s1 );_CrtMemCheckpoint 会将当前内存状态填充在该结构中。
如果要查看输出 _CrtMemState 结构的内容,可使用_ CrtMemDumpStatistics 函数:_CrtMemDumpStatistics( &s1 );//_ CrtMemDumpStatistics 输出内存状态转储,如下所示:// 0 bytes in 0 Free Blocks.// 0 bytes in 0 Normal Blocks.// 3071 bytes in 16 CRT Blocks.// 0 bytes in 0 Ignore Blocks.// 0 bytes in 0 Client Blocks.// Largest number used: 3071 bytes.// Total allocations: 3764 bytes.若要确定在某个代码部分中是否发生了内存泄漏,可以对这部分之前和之后的内存状态拍快照,然后使用 _ CrtMemDifference 比较两个状态:
_CrtMemCheckpoint( &s1 );// memory allocations take place here_CrtMemCheckpoint( &s2 );if ( _CrtMemDifference( &s3, &s1, &s2) ){_CrtMemDumpStatistics( &s3 );}_CrtMemDifference比较内存状态 s1 和 s2,在 (s3) 中返回结果,即 s1 与 s2 的差异。
寻找内存泄漏的一个方法是,首先在应用程序的开头和结尾部分放置 _CrtMemCheckpoint 调用,然后使用 _CrtMemDifference 比较两个结果。 如果 _CrtMemDifference 显示有内存泄漏,通过添加更多 _CrtMemCheckpoint 调用来使用二进制搜索划分程序,直至找到泄漏源。
- 贴几张自己使用的结果图
默认输出的结果
输出代码信息的结果(注意源文件名和行号)
把内存泄露检测结果自定义输出到屏幕
3 0
- Visual Studio内存泄露检测工具
- 内存泄露检测工具 -- Visual Leak Detector
- 内存泄露检测工具 -- Visual Leak Detector (转)
- 内存泄露检测工具 Visual Leak Detector
- 内存泄露检测工具Using Visual Leak Detector
- vld(Visual Leak Detector 内存泄露检测工具
- vld(Visual Leak Detector) 内存泄露检测工具
- Visual C++内存泄露检测工具(VLD)
- Visual C++内存泄露检测工具(VLD)
- Visual C++内存泄露检测工具(VLD)
- vc6.0内存泄露之检测工具Visual Leak Detector
- C++内存泄露检测工具Visual Leak Detector的使用
- 内存泄露检测工具
- 内存泄露检测工具
- 内存泄露检测工具
- 内存泄露检测工具比较
- 内存泄露检测工具 LeakInTheHole!
- 内存泄露检测工具
- Linux 添加服务详解
- ffmpeg 时间戳问题汇总
- HDOJ 1004 Let the Balloon Rise
- 高质量程序设计指南<C/C++语言>笔记记录
- startActivityForResult用法详解
- Visual Studio内存泄露检测工具
- 3Q大战——谁是赢家?
- GCC 中的编译器堆栈保护技术
- 将object类型转换为byte[]数组
- OCP-1Z0-051 第103题 CASE.. WHEN,TO_CHAR,TRIM的用法
- Java中的容器
- Eclipse上GIT插件EGIT使用手册之八_解决推送冲突
- 【C语言学习】05__const和volatile的分析
- 使用librtmp库发布直播流