方法一、
1、头文件:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
 注意 
#include 语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作。 
 
2、在添加了上面所示语句之后,可以通过在程序中包括以下语句来转储内存泄漏信息:
_CrtDumpMemoryLeaks();//在最后一个语句添加

或通过下面方法添加。
_CrtSetDbgFlag
如果程序总是在同一位置退出,调用 _CrtDumpMemoryLeaks 将非常容易。如果程序从多个位置退出,则

无需在每个可能退出的位置放置对 _CrtDumpMemoryLeaks 的调用,而可以在程序开始处包含以下调用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

方法二、通过内存状态比较
 1、功能:可以检测某段代码间的内存泄露.
    描述: 若要确定代码中某一部分是否发生了内存泄漏,可以在该部分之前和之后对内存状态拍快照

,然后使用 _CrtMemDifference 比较这两个状态:

_CrtMemState s1, s2, s3;_CrtMemCheckpoint(&s1);// memory allocations take place here_CrtMemCheckpoint(&s2);if (_CrtMemDifference(&s3, &s1, &s2)){//打印内存泄露_CrtMemDumpStatistics(&s3);}else{//无泄露}

方法三、

有些内存泄露是不会dump出来详细信息的,只会给出内存块号,这种情况一下一般可以用一下方法调试出来。

这两天调一个程序,发现每次退出都有内存泄漏,在此总结一个调试内存泄漏的好方法。

对于比较明显的内存泄漏,vc2008是比较容易定位的,在Debug模式F5运行,退出时会列出引起内存泄漏的问题代码所在文件及行号;但如果是比较隐蔽的内存泄漏,Output输出窗口只会输出部分信息,形式如下:

Detected memory leaks!
    Dumping objects ->
    {858} normal block at 0x003ED290, 12 bytes long.
    Data: < \H         > A0 5C 48 00 00 00 00 00 00 00 00 00
    Object dump complete.

我们来看一下输出信息的格式。

{xxx} — 表示程序运行后第xxx次内存分配发生了泄漏,即内存分配编号;

xxx block — 表示内存块类型,包括三种:普通(normal)、客户端(client)和运行时(CRT);

at 0xFFFFFFFF — 表示发生泄漏的内存地址,用十六进制表示;

xx bytes long — 表示发生泄漏的内存大小;

Data:xxx — 表示内存数据信息,一般输出前16字节的内容。

内存泄漏的地址、大小和数据信息很难对我们的定位起到有效地帮助,但是如果我们能够让程序停在分配有泄漏的内存的地方,然后根据调用堆栈(Call Stack)里的信息,就可以很方便的定位是哪个语句出现问题。幸运的是,VC的C运行库(C run-time library)为我们提供了一个这样的函数:CrtSetBreakAlloc,声明如下:

long _CrtSetBreakAlloc( long lBreakAlloc );

其中参数lBreakAlloc即为内存分配号(花括号中的数字)。我们只要在程序初始化函数中添加语句:_CrtSetBreakAlloc(858)就可以使程序在Debug F5运行时自动断点到我们想要的位置。

使用这个函数进行内存泄漏定位有个条件,即发生内存泄漏的分配号是固定的,每次启动程序不会随机变化。

但是如果我们的程序比较大,内存泄漏也不止一个,用上面的方法调试可能会很麻烦,需要经常更新代码并重新编译程序。使用下面的方法更方便

首先确定自己的程序使用的是哪个C运行库,方法是程序Propertise -> C/C++ -> Code Generation -> Runtime Library选项,若为Multi-threaded Debug(/MTd),则为静态链接,若为Multi-threaded Debug DLL(/MDd),则为动态链接。

然后按F11启动程序,程序会停在入口点。此时调出Watch窗口,

静态链接 在name项中输入_crtBreakAlloc,在value项中输入你要定位的内存分配编号;

动态链接 在name项中输入{,,msvcr90d.dll}_crtBreakAlloc,在value项中输入内存分配号。注意msvcr90d.dll是vc2008环境使用的运行库dll,若你用的是其他版本vc,请换成对应版本的dll。

现在按F5运行,程序就会自动定位到你要调试的内存分配语句,这时候看call stack的信息会很有帮助。

这个办法使用起来非常灵活,只要你确定内存分配号是不变的,就可以方便地为程序设置断点了,省去了更新代码和编译的麻烦。这个方法几乎是当前进行内存泄漏调试的最有效方法,如果你发现内存泄漏的分配号是变化的,可以想办法去掉一些没有问题的内存申请(多半是界面和多线程涉及到的申请),尽量使有问题的分配固定,就可以用这个方法排错了。

vs内存泄露检测方法相关推荐

  1. android native堆内存泄露,Android Native内存泄露检测

    Android Studio没有提供直接的Native层的内存泄露检测工具,但我们仍可以通过开源工具进行动态检测和静态检测 动态检测 在APP运行时进行检测,就像LeakCanary Update: ...

  2. Android NDK 内存泄露检测

    前言 最近写C++代码,老是担心代码存在内存泄露,胆战心惊的,Andorid中Java层代码内存泄露可以借助leakcanary进行检测:找了一番,找到了PC上C++上的内存泄露检测库LeakTrac ...

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

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

  4. memwatch内存泄露检测工具

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

  5. UE3 MemLeakCheck Tracking(内存泄露检测追踪)

    MemLeakCheck Tracking(内存泄露检测追踪) 概述 运行 MemLeakCheck MemLeakCheck MemLeakCheck -fast Release vs. Test ...

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

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

  7. arm linux下交叉编译valgrind工具进行内存泄露检测和性能分析

    C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种纠结的问题.如果crash的地方正是内存使用错误的地方,说明你人品好.如果crash的地方内存明显不是consistent的 ...

  8. Visual Studio内存泄露检测工具

    使用简介 在写程序的过程中,难免会遇到内存泄露的时候,这个时候如果手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是很耗时间和精力的.诚然,我们可以借助一些工具,而且我们还会惊奇地发现这 ...

  9. Netty源码解析-Netty内存泄露检测

    前言: 在前一篇文章中,我们介绍了ByteBuf的引用计数器的使用,基本所有的ByteBuf都有相关计数的功能,那么这个计数有什么用呢. 实际主要就是做内存泄露检测用的.本文就其如何做检测来进行说明. ...

最新文章

  1. 关于计算机组装的作文,电脑小白组装电脑,能写出这样的配置,在下佩服!
  2. 如何绘制caffe网络训练曲线
  3. python中if else语句用法_Python中if-else语句的多种写法
  4. java第四次上机作业_第十java上机作业
  5. 模型算法_推荐算法之隐语义模型
  6. Halcon 学习总结——基于动态阈值法、GMM(高斯混合模型)、SVM(支持向量机)的网状物缺陷检测
  7. delete语句与reference约束冲突怎么解决_一条简单的更新语句,MySQL是如何加锁的?...
  8. Python成员运算符
  9. 编写程序也需要在实战中成长
  10. 传智播客 机器学习基础 学习笔记
  11. python 多继承冲突_python:super()对多继承的影响
  12. 关于soapUi工具的安装使用教程
  13. 201671010447杨露露 实验二词频统计软件项目报告
  14. JavaEE:HTML
  15. 微信小程序之videoshow-fullscreen-btn失效问题
  16. SpringBoot 内嵌容器
  17. 跨境电商运营 | 如何利用Instagram进行电子商务营销
  18. PAAS容器安全防护
  19. python与java-还在纠结选Python还是Java?看完就有数了
  20. 由一条关于普元软件的新闻产生的感想

热门文章

  1. 技术分析:搞懂链路追踪
  2. python3 爬淘女郎
  3. php纯面向过程--论坛
  4. FGPA 双向 IO 自动方向控制
  5. Rsyslog分类过略消息关键字收集程序日志
  6. 3月上旬中国域名解析服务商TOP10 DNSPOD升至8.24%
  7. LINQ to SQL语句(4)之Join
  8. 工具类静态方法注入dao
  9. Dubbo源码解析 --- DIRECTORY和ROUTER
  10. [转] DataSet的的几种遍历