使用简单介绍

    在敲代码的过程中。难免会遇到内存泄露的时候。这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的。诚然。我们能够借助一些工具,并且我们还会惊奇地发现这些工具非常实用(比方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. SQL Server T—SQL 视图 事务

    一 视图 视图是存储在数据库中的查询的SQL 语句, 视图是从一个或多个表或视图中导出的表,是一张虚表,只能对视图进行查询,不能增.删.改. 对视图进行修改要在相应的基本表中进行修改,修改会自动的反应 ...

  2. C语言关于形参与实参,以及系统堆栈的关系

  3. 非常可乐(杭电hdu1495)bfs

      非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. PHP DDos的几个防御方法详解

    这类攻击有一个最大的特性,就是上传流量霎时增大,通常流量高达数十以至近百M,将整台效 劳器,以至将整台机柜的宽带堵住,使网站无法运转,而这样的攻击,我们无法从远程处理,一但那个phpshell运转,你 ...

  5. C++11 使用 std::async创建异步程序

    c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...

  6. MVC--DefaultModelBinder解析request参数

    转载:http://www.cnblogs.com/leotsai/p/ASPNET-MVC-DefaultModelBinder.html 看到很多ASP.NET MVC项目还在从request.q ...

  7. C#将图片存放到SQL SERVER数据库中的方法

    本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: ? 1 2 3 4 5 6 7 8 9 10 //获取当前选择的图片 this.pictu ...

  8. python 数据结构中的链表操作

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

  9. HBase安装与应用

    1.  参考说明 参考文档: https://hbase.apache.org/book.html 2.  安装环境说明 2.1.  环境说明 CentOS7.4+ Hadoop2.7.5的伪分布式环 ...

  10. Android 优秀开源项目

    以下是本人日常工作中收集的比较不错的Android开源项目 roottools: RootTools gives Rooted developers easy access to common roo ...