Visual Studio内存泄露检測工具
使用简单介绍
)。那么怎样实现了,基本的几个函数现先列举一下:_CrtDumpMemoryLeaks,_CrtMemCheckpoint,_CrtMemDifference
- CrtDumpMemoryLeaks :当前全部没有销毁的对象(没有delete和free),默认情况下输出到调试窗体
- _CrtMemCheckpoint:保存当前全部没有销毁的对象的状态
- _CrtMemDifference:比較两个_CrtMemCheckpoint保存的状态。返回差异值
简单的使用_CrtDumpMemoryLeaks能够检測当前没有释放的对象。可是假设程序大一点。须要确定某一段程序是否有问题时,就须要后面的两个參数了。_CrtMemCheckpoint保存的是_CrtDumpMemoryLeaks的结果。假设我们在一段程序的前后分别保存一个状态,那么通过比較这两个状态我们就能够获知这一段程序是否有内存泄露的问题了。
使用演示样例
- 启用内存泄露调试支持
#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 调用来使用二进制搜索划分程序,直至找到泄漏源。
- 贴几张自己使用的结果图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXJiYm90ZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:18px;" />
默认输出的结果
输出代码信息的结果(注意源文件名称和行号)
把内存泄露检測结果自己定义输出到屏幕
Visual Studio内存泄露检測工具的更多相关文章
- c++程序内存泄露检測工具
功能: 用于检測c++程序的内存泄露. 原理: 事实上非常easy,就是通过函数的重载机制,捕获应用程序的new, new[] , delete , delete[], malloc,calloc,f ...
- Linux C 编程内存泄露检測工具(二):memwatch
Memwatch简单介绍 在三种检測工具其中,设置最简单的算是memwatch,和dmalloc一样,它能检測未释放的内存.同一段内存被释放多次.位址存取错误及不当使用未分配之内存区域.请往http: ...
- Visual C++ 2012/2013的内存溢出检測工具
在过去,每次编写C/C++程序的时候,VLD差点儿是我的标配.有了它,就能够放心地敲代码,随时发现内存溢出. VLD最高可支持到Visual Studio 2012.不知道以后会不会支持Visual ...
- 内存泄露检測及cvClone造成的泄露
调了几个小时,到最后发现内存泄露的原因是opencv的cvClone函数,採用cvCopy函数后,问题解决. vs2010使用vld进行内存泄露检測 (1) 下载vld工具 (2) 将D:\Progr ...
- Visual C++内存泄露检测—VLD工具使用说明[转]
Visual C++内存泄露检测—VLD工具使用说明 一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...
- 【VS开发】Visual C++内存泄露检测—VLD工具使用说明
Visual C++内存泄露检测-VLD工具使用说明 一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...
- C++内存泄露检測原理
转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探 ...
- LeakCanary:简单粗暴的内存泄漏检測工具
差点儿每一个程序猿在开发的过程中都会遇到内存泄漏.那么我们怎样检測到app是否哪里出现内存泄漏呢?square公司推出了一款简单粗暴的检測内存泄漏的工具-- LeakCanary 什么是内存泄漏? 内 ...
- Visual C++内存泄露检测—VLD工具使用说明
一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还 ...
随机推荐
- 低级问题: jquery-ajax-alert(data) <!DOCTYPE html PUBLIC "-
后台:Response.Write("登录成功"); 前台:Jquery-Ajax--alert(data)弹出: 登录成功 <!DOCTYPE html PUBLIC &q ...
- MyBatis动态添加—trim标签
做添加时,部分字段有值,没值的字段不添加,这就是动态添加,使用 trim 标签就可以实现. <insert id="insertSysUser" parameterType= ...
- 如何解决VMware 虚拟机不能铺满屏幕
出现这种情况是因为分辨率设置问题,调整分辨率总能达到你想要的效果: 首先设置vmware为全屏模式 查看物理机的分辨率,然后再将虚拟机的分辨率设置了跟物理机的一致.完美解决 windows10查看分辨 ...
- Android使用AOP
这里不讲aop的概念,网上资料很多,这里只讲如何配置aop和自定义plugin. 1.使用场景 在android中,有些业务是公共的,例如:登录判断.获取权限.网络判断等一些公用的业务逻辑,这些都可以 ...
- Codeforces35E(扫描线)
E. Parade time limit per test:2 seconds memory limit per test:64 megabytes input:input.txt output:ou ...
- RBAC 介绍 (权限)
RBAC是什么? RBAC是基于角色的访问控制(Role-Based Access Control )在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权 ...
- 让你彻底搞懂JS中复杂运算符==
让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ...
- python内置函数每日一学 -- abs()
abs(x) 官方文档解释: Return the absolute value of a number. The argument may be an integer or a floating p ...
- DOM的查找,新增,删除操作
查找 1. document.getElementById() 通过ID获取元素,由于ID唯一,所以获取的是一个元素 2. document.getElementsByTagName() 通过标签名 ...
- SQLServer 事物与索引
SqlServer 事物与索引 分享by:授客 QQ:1033553122 详情点击百度网盘分享链接: SqlServer 事物与索引.ppt