使用简介

在写程序的过程中,难免会遇到内存泄露的时候,这个时候如果手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是很耗时间和精力的。诚然,我们可以借助一些工具,而且我们还会惊奇地发现这些工具很有用(比如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 调用来使用二进制搜索划分程序,直至找到泄漏源。

  • 贴几张自己使用的结果图

默认输出的结果

输出代码信息的结果(注意源文件名和行号)

把内存泄露检测结果自定义输出到屏幕

Visual Studio内存泄露检测工具相关推荐

  1. Visual studio内存泄露检查工具--BoundsChecker

    BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...

  2. visual studio内存溢出检测工具_详解JVM内存管理与垃圾回收机制2 何为垃圾

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背 ...

  3. Visual Studio 内存泄漏检测方法

    Visual Studio 内存泄漏检测方法 非MFC程序可以用以下方法检测内存泄露: 1.程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK ne ...

  4. 几种内存泄露检测工具的比较

    概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的.复杂的应用程序中,内存泄漏是常见的问题.当以前分配的一片内存不再需要使用或无法访问时,但是却 ...

  5. Ubuntu下内存泄露检测工具Valgrind的使用

    在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...

  6. 精准 iOS 内存泄露检测工具

    MLeaksFinder:精准 iOS 内存泄露检测工具 发表于 2016-02-22   |   zepo   |   23 Comments 背景 平常我们都会用 Instrument 的 Lea ...

  7. 内存泄露检测工具比较

    From: http://blog.163.com/zhuang_qianxin/blog/static/29765138201051092529107/ 1.     ccmalloc-Linux和 ...

  8. 内存泄露检测工具VLD相关配置

    参考链接: VLD(Visual LeakDetector)内存泄露库的使用 VS2019编译 内存泄漏检测工具VLD 一.源码下载 源码下载链接:https://github.com/KindDra ...

  9. memwatch内存泄露检测工具

    工具介绍 官网 http://www.linkdata.se/sourcecode/memwatch/ 其功能如下官网介绍,挑选重点整理: 1. 号称功能: 内存泄露检测 (检测未释放内存, 即 动态 ...

最新文章

  1. 怎样解决输入法不能切换?
  2. LeetCode18.四数之和 JavaScript
  3. wxWidgets:wxSpinButton类用法
  4. PHP中一些可用的方法
  5. postman和部署在 SAP 云平台上的SAP UI5应用发送同样的HTTP请求,为何前者成功,后者失败?
  6. 数据结构 二、向量(接口与实现and可扩容向量)
  7. Java之Socket与HTTP区别
  8. 面对挫折:给即将或已经遭受社会毒打的每一个人
  9. 三星Galaxy S22系列零部件开始量产:搭载骁龙898 最早1月亮相
  10. Android学习笔记(九)——更复杂的进度对话框
  11. chrome中如何下载文本文件(不是直接打开)
  12. 基于微信小程序开发——音乐播放器
  13. 计算机网络实验(二)2交换机的基本配置与管理
  14. 随机摄动法 matlab 随机振动,基于随机摄动法的齿轮系统动态响应及灵敏度分析...
  15. logout退出登录该用get方法还是post方法?
  16. 潜力巨大的柔性传感器为什么这么难发展?142位学者联手,发表这篇重磅论文!...
  17. turtle绘画,设置画布的背景图片
  18. SQL Server中修改表的前缀
  19. linux 系统命令被后门修改_Linux、Windows权限维持常用后门学习总结
  20. 爬取bilibili视频

热门文章

  1. 从华为智慧生活APP的智能场景,谈到建成华为专属的智慧生活管理后台
  2. rk3566 HDMI 热插拔HDMI显示无信号
  3. python调用R语言
  4. LabVIEW图表之双坐标轴
  5. internet协议dns服务器地址,DNS服务器配置使用 及全国DNS地址大全
  6. 黑马程序员————第三天
  7. win10打开软件显示c盘服务器,【解决】win10 打开本地磁盘 提示找不到应用程序...
  8. Ameya详解:村田的用于人机界面和生命体征检测的压电薄膜传感器
  9. Scoks5 一键搭建脚本,解决nolanjdc被限制IP
  10. matlab着色问题,着色问题matlab