Visual Studio(或者VC)内存泄露工具

使用简介

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

  • 比较内存泄露状态

定位内存泄漏的另一种技术涉及在关键点对应用程序的内存状态拍快照。 若要为应用程序中给定点的内存状态拍快照,创建 _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(或者VC)内存泄露工具

时间: 2024-10-11 23:03:33

Visual Studio(或者VC)内存泄露工具的相关文章

《Visual C++ 2010入门教程》系列一:关于Visual Studio、VC和C++的那些事

原文:http://www.cnblogs.com/Mrt-02/archive/2011/07/24/2115606.html 作者:董波 日期:2010.6.15 写在前面 在我还在上学的时候,我选择了C++,最初我用VC6作为我的IDE,我看过很多本C++的教材,有的适合我,有的不适合我,其中有一本叫<Visual C++ 2005入门经典>的书帮了我不少的忙.因为通常的C++教材都只会介绍C++的语法什么的,很少会告诉我们如何去编译.运行,告诉我们什么是控制台程序,什么事Win程序,什

vld(Visual Leak Detector) 内存泄露检测工具,Visual C++ 2008-2015

原文: https://vld.codeplex.com/ Visual Leak Detector 是一款专用于Visual C++的内存泄漏检测工具,它免费,开源,且鲁棒性高. VLD很容易使用: 1. 安装完vld后,只要告诉Visual C++哪里去找到它的头文件和库.(下载地址:https://vld.codeplex.com) 2. 然后您只要在你的c/c++工程中加上下面这一行代码,就可以使用vld了:#include <vld.h> 您的工程在Visual Studio deb

VC++ 内存泄露与检测的一种方法

    本文介绍,当VC++或者MFC程序,出现内存泄露时,如何快速定位的方法,这种方法有一定的局限性,在注意事项中会给出的. MFC程序     当MFC程序出现内存泄露时,退出程序时的VS调试输出窗口,一般会有如下显示:    上面显示了在程序的哪个文件的哪行语句,发生了内存泄露,其中:    {345}: 表示 内存分配编号    normal block:表示 内存块类型,有普通块(普通程序分配).客户端块(分配基于CObject的内存)和CRT块(库函数内部分配)这几种类型    0x

备忘: Visual Studio 2013 VC++ IDE 使用小贴示。

对 Visual Studio 2013 的 IDE 不熟悉.刚用VS 中的 VC++ IDE 进行编程,一些东西用得少,或以后久了不用,怕又忘了.现在慢慢知道点,记录点,以备以后查阅. 1. 记编译出来的的EXE文件不需要DLL库支持. 选中项目,点右键-->属性.在属性设置中,选“配置属性”-->“C/C++“下的“代码生成”.将“运行库”设为:“多线程 (/MT)”:编译后,就单独运行EXE文件而不需要DLL库文件支持了.反之选“多线程 DLL (/MD)”.想不要MFC库支持.在选“配

Visual Studio 和VC++关系

Visual Studio .net Visual C++ .net Visual C++ _MSC_VER 备注 Visual Studio .net 2002 Visual C++ .net 2002 Visual C++ 7.0 _MSC_VER=1300   Visual Stuido .net 2003 Visual C++ .net 2003 Visual C++ 7.1 _MSC_VER=1310   Visual Studio 2005 Visual C++ 2005 Visua

C++ 检测内存泄露工具 -- Windows平台

平台:Windows7 64bit,编译器G++(mingw) 工具:Dr Memory,项目主页:https://code.google.com/p/drmemory/ (可能要FQ,可能会很慢,所以,可以直接按照下面官方主页给出的链接下载,我也放了一份Windows版的在百度网盘,http://pan.baidu.com/s/1qWv2tZm,这个应该肯定可以下载) The latest versions can be directly accessed here: Dr. Memory i

为 Visual Studio 配置 Git 源代码管理工具

使用 Visual Studio 可以配合 Git 工具做版本管理.也可以直接将工程同步到 GitHub 上.配置过程非常简单. 首先你要安装 GIt,安装和配置步骤见 安装 Git,Windows 上只要替换其中的安装步骤,其他类似. 在 Visual Studio 安装插件 Git Source Control Provider 然后在 tools->options->source control 中配置源代码管理,将默认的修改为 Git Source Control Provider 配

Visual Studio+TFS--强大的项目管理工具

一.前言 微软的Visual Studio非常强大,可以无缝结合Git或自家的TFS(Team Foundation Server),进行项目管理非常方便,从需求分析.开发.测试.维护,几乎可以贯穿软件开发的整个生命周期.这篇文章将会详细介绍如何使用Visual Studio结合TFS进行项目管理. 二.什么是TFS TFS是一种为 Microsoft 产品提供 源代码管理. 数据收集. 报告和项目跟踪,而为协作 软件开发 的项目. 可作为独立的软件,或 Visual Studio Team S

Visual Studio: 一键卸载所有组件工具,彻底卸载干净。

第一步.手动卸载VS主体 第二步.下载工具并解压 网盘下载地址:https://pan.baidu.com/s/1eSHRYxW 也可以在Github上下载最新版本:https://github.com/Microsoft/VisualStudioUninstaller/releases 第三步.管理员权限运行,并输入Y(yes),等待卸载完成.