使用简单介绍

    在敲代码的过程中。难免会遇到内存泄露的时候。这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的。诚然。我们能够借助一些工具,并且我们还会惊奇地发现这些工具非常实用(比方Intel的内存泄露检測工具)。可是由于往往这些工具安装比較麻烦,而我们写的程序又不是非常大,所以我们也许能够找个更小巧的方法。微软就提供了这个方案。我们仅仅须要在程序中加入几行代码,就能够发现内存泄露的问题,然后我们就能够定位内存泄露了(自己用几行代码就能够实现,奇妙!

)。那么怎样实现了,基本的几个函数现先列举一下:_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内存泄露检測工具的更多相关文章

  1. c++程序内存泄露检測工具

    功能: 用于检測c++程序的内存泄露. 原理: 事实上非常easy,就是通过函数的重载机制,捕获应用程序的new, new[] , delete , delete[], malloc,calloc,f ...

  2. Linux C 编程内存泄露检測工具(二):memwatch

    Memwatch简单介绍 在三种检測工具其中,设置最简单的算是memwatch,和dmalloc一样,它能检測未释放的内存.同一段内存被释放多次.位址存取错误及不当使用未分配之内存区域.请往http: ...

  3. Visual C++ 2012/2013的内存溢出检測工具

    在过去,每次编写C/C++程序的时候,VLD差点儿是我的标配.有了它,就能够放心地敲代码,随时发现内存溢出. VLD最高可支持到Visual Studio 2012.不知道以后会不会支持Visual ...

  4. 内存泄露检測及cvClone造成的泄露

    调了几个小时,到最后发现内存泄露的原因是opencv的cvClone函数,採用cvCopy函数后,问题解决. vs2010使用vld进行内存泄露检測 (1) 下载vld工具 (2) 将D:\Progr ...

  5. Visual C++内存泄露检测—VLD工具使用说明[转]

    Visual C++内存泄露检测—VLD工具使用说明 一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...

  6. 【VS开发】Visual C++内存泄露检测—VLD工具使用说明

    Visual C++内存泄露检测-VLD工具使用说明 一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...

  7. C++内存泄露检測原理

    转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探 ...

  8. LeakCanary:简单粗暴的内存泄漏检測工具

    差点儿每一个程序猿在开发的过程中都会遇到内存泄漏.那么我们怎样检測到app是否哪里出现内存泄漏呢?square公司推出了一款简单粗暴的检測内存泄漏的工具-- LeakCanary 什么是内存泄漏? 内 ...

  9. Visual C++内存泄露检测—VLD工具使用说明

    一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还 ...

随机推荐

  1. Weex 学习文档、跳转路径、控制台输出、we转js汇总

    最近在学习阿里的weex框架,网上教程真是不少,但是有用的确实是少的很.其中大多数都是讲如何配置移动端的,很少有讲到weex语法的.要知道,如果真需要用weex编写js页面的话,很有可能是移动端开发者 ...

  2. Win10 新功能 改变显示器色彩

    如果你是一个爱看书的工作族,相信一定梦想你的电脑变得跟Kindle一样,这样每天盯着电脑几个小时,眼睛都不会痛了……下面就来看看Win10带来的新体验吧! Ctr+ Windows Key + C 可 ...

  3. ubuntu下安装 Sublime Text 3 及 PlantUML 绘图插件

    ubuntu下只想做C++的程序代码编写,最开始选择了codeblock,主要目的是安装简单,集成度高,还可以调试,但是用的时候老是无故退出,改了半天的代码就这样丢失,挺苦恼的,可能跟自己装的系统比较 ...

  4. HDU2167(SummerTrainingDay02-D 状态压缩dp)

    Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  5. Codeforces500C(SummerTrainingDay01-G)

    C. New Year Book Reading time limit per test:2 seconds memory limit per test:256 megabytes input:sta ...

  6. 使用ThinkPHP实现生成/校验验证码功能

    首先了解父类Verity.class.php(ThinkPHP/Library/Think/Verity.class.php)中的一些函数 1:check() 校验验证码是否正确 2:entry()输 ...

  7. mysql数据库操作指令

    数据库相关 查询所有数据库 show databases; 创建数据库 create database 数据库名: 创建数据库指定字符集 create database 数据库名 character ...

  8. WebSerivce与WebAPI的区别

    一.什么是Web Service Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应 ...

  9. 如何迁移 ArcGIS Enterprise WebGIS( Portal Server DataStore )系统

    在部署ArcGIS Enterprise WebGIS系统的时候,往往由于后期系统的扩容需求,需要把已经部署好的组件迁移到其他服务器中. ArcGIS WebGIS系统涉及的软件组件有Portal S ...

  10. 基于 WPF 平台的 ActiveReports Viewer控件

    ActiveReports 报表控件致力于为组织和个人提供最出色的报表解决方案,多年来ActiveReports已经提供了 Windows Forms.Web.Silverlight和Flash平台的 ...