我在看DirectX Sample的时候,看到以下代码:

  1. // Enable run-time memory check for debug builds.
  2. #if defined(DEBUG) | defined(_DEBUG)
  3. _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

  既然是debug,肯定是多输出了什么信息,根据注释来看,应该是可以检测出内存使用的相关错误。而在C++中,内存泄露一直是一个很蛋疼的问题,以前不知道有什么方法解决。顺着这段代码上网搜了下,果然有内存泄露的检测。

以下转自http://blog.csdn.net/hayyoung/article/details/8565871

一、vs监测内存泄露,利用crt库就可以,不需要利用专门的工具。操作仅2步。

1、增加宏和头文件

  1. #define _CRTDBG_MAP_ALLOC
  2. #include <stdlib.h>
  3. #include <crtdbg.h>

注意:为了保证这三行代码的顺序,最前面放这三行代码。假设我们在这3行之前,增加#include <iostream>, 因iostream包含了stdlib.h,则会隐式破坏顺序,导致malloc函数内存泄露的时候,输出信息窗口不显示具体的行数。

2、程序仅一个出口(return),在需要监测地方,调用_CrtDumpMemoryLeask函数,运行程序后,输出消息窗口显示内存泄露的地方。

  1. _CrtDumpMemoryLeaks();

如果程序有几个出口(return),不需要显式调用_CrtDumpMemoryLeask(),仅用_CrtSetDbgFlag 设置_CRTDBG_ALLOC_MEM_DF and_CRTDBG_LEAK_CHECK_DF即可

  1. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

例1:

  1. #define _CRTDBG_MAP_ALLOC
  2. #include <stdlib.h>
  3. #include <crtdbg.h>
  4.  
  5. int main()
  6. {
  7. int *p = (int*)malloc();
  8. _CrtDumpMemoryLeaks();//退出前检查一下内存泄露情况
  9. return ;
  10. }

①内存泄露的位置,双击到达相关代码。

②内存的类型,可以为normal, client, crt。

③泄露内存大小,这里泄露了100。

注意:利用new的分配内存,定义下面的宏,以便显示内存泄露的具体位置。

  1. #ifdef _DEBUG
  2. #ifndef DBG_NEW
  3. #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
  4. #define new DBG_NEW
  5. #endif
  6. #endif // _DEBUG

例2:

  1. #define _CRTDBG_MAP_ALLOC
  2. #include <stdlib.h>
  3. #include <crtdbg.h>
  4.  
  5. #ifdef _DEBUG
  6. #ifndef DBG_NEW
  7. #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
  8. #define new DBG_NEW
  9. #endif
  10. #endif // _DEBUG
  11.  
  12. int main()
  13. {
  14. //程序退出前检查内存泄露。
  15. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  16. int *p = new int();
  17. return ;
  18. }

二、在分配内存序号下断点

1、在程序的开头设置断点,然后f5运行程序。

2、在程序中断的时候,打开监视窗口。

3、如果运行库是/MDd输入_crtBreakaAlloc。否则是/MTd输入{,,msvcr90d.dll}_crtBreakAlloc(vs2010是{,,msvcr100d.dll}_crtBreakAlloc其他版本类推),

默认没下断点是-1,这里我们修改,设置在分配序号52内存块下断点(记得回车,变红色才是修改成功)。

4、继续运行,下断成功。

参考资料:http://msdn.microsoft.com/en-us/library/x98tx3cf%28v=vs.90%29.aspx

C++内存泄露调试的更多相关文章

  1. android内存泄露调试,Heap,MAT

    三.内存监测工具 DDMS --> Heap 无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中 ...

  2. Android内存泄露调试

    Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...

  3. iOS_SN_Xcode内存泄露调试

    用Xcode进行内存调试有两种方法: 1.静态方法 2.动态方法 静态方法是直接在Xcode的菜单栏中选择product-->analyze 如截图所示. 之后会看到Xcode的编译状态上会有如 ...

  4. 转:Android开发:使用DDMS Heap进行内存泄露调试

    无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方.Android tools中的DDMS就带有一个很不错的内存监测工具Heap,本 ...

  5. android 内存泄露调试

    一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) ...

  6. Visual Studio内存泄露检測工具

    使用简单介绍     在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...

  7. 记一次内存泄漏调试(memory leak)-Driver Monkey

    Author:DriverMonkey Mail:bookworepeng@Hotmail.com Phone:13410905075 QQ:196568501 硬件环境:AM335X 软件环境:li ...

  8. 排查python内存泄露中几个工具的使用

    本文主要介绍3个工具:pdb,objgraph,以及pympler. 1.pdb pdb是专门用于python代码调试,模仿gdb. 使用pdb可以查看堆栈,打印变量等. 这里介绍的是命令行下的pdb ...

  9. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

随机推荐

  1. saltstack实战4--综合练习4

    Saltstack配置管理-给minion增加Zabbix-agent zabbix-agent的包 [root@A ~]# rpm -qa |grep zabbix zabbix-2.4.8-1.e ...

  2. hdu 3635 Dragon Balls

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  3. ios自动滚动图片功能源码

    源码AdScrollerView,一个已经封装好的UIScrollView的子类,可以自动滚动图片以及对应的描述语,类似淘宝app首页的广告滚动效果.滚动图片数量不限,并且显示pageControl. ...

  4. Delegate&Event

    Delegate 1.基本类: public class Student { public int Id { get; set; } public string Name { get; set; } ...

  5. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuer ...

  6. c#跨窗体调用操作

    我知道的常用的有三种,以前记录的笔记: 1.通过构造函数实现 在form1的load事件中new form2时  在构造函数里添加一个参数 此参数就是form1类型的参数,同时记得在form2里重写构 ...

  7. AE实现矢量图层标注属性

    添加引用ESRI.ArcGIS.Carto 1.获取图层 IGeoFeatureLayer pFtrLayer = m_pLayer as IGeoFeatureLayer; 2.初始化标注属性集合 ...

  8. From MSI to WiX, Part 8 - Major Upgrade, by Alex Shevchuk

    Following content is reprinted from here, please go to the original website for more information. Au ...

  9. [转]WINDOW进程通信的几种方式

    windows进程通信的几种方式 1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针 ...

  10. pthread 实现生产者消费者问题

    经典的生产者消费者问题,在这里用信号量和互斥量来实现生产和消费者模型   #include<cstdlib> #include<cstdio> #include<unis ...