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

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

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

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

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

1、增加宏和头文件

 #define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

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

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

 _CrtDumpMemoryLeaks();

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

 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

例1:

 #define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> int main()
{
int *p = (int*)malloc();
_CrtDumpMemoryLeaks();//退出前检查一下内存泄露情况
return ;
}

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

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

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

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

 #ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG

例2:

 #define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> #ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG int main()
{
//程序退出前检查内存泄露。
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
int *p = new int();
return ;
}

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

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. 安装SqlServer2008时相关问题

    在安装SqlServer2008时,安装程序支持规则,老提示重启计算机 1,运行 regedit 打开注册表编辑器. 2,依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ...

  2. 【Knockout】五、创建自定义绑定

    概述 除了上一篇列出的KO内置的绑定类型(如value.text等),你也可以创建自定义绑定. 注册你的binding handler ko.bindingHandlers.yourBindingNa ...

  3. C#算法基础之递归排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. HDOJ2029Palindromes _easy version

    Palindromes _easy version Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  5. HDOJ2013蟠桃记

    蟠桃记 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  6. Ajax-数据格式-xml,json

    xml demo testDataXml <%@ page language="java" contentType="text/html; charset=UTF- ...

  7. sqlserver2008 如何定时清理索引碎片

    sqlserver2008 如何定时清理索引碎片 查询索引引起的表垃圾碎片sql脚本:  SELECT object_name(a.object_id) [TableName] ,a.index_id ...

  8. knowlege experience

    The konwledge is you need learning some basic knowledge. The experience is you can use konwledge  ma ...

  9. asp.net C#数据导出Excel实例介绍

    excel导出在C#代码中应用己经很广泛了,我这里就做些总结,供自己和读者学习用. Excel知识点. 一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引用,它 ...

  10. 交叉编译lsof for android

    Android 自带的那个 lsof 实际上是 toolbox 里的,功能十分单一,除了显示出所有进程的所有打开的文件外就什么都不能做,连说明也没有 :-( 于是为了 htop 用着爽一点,还是自己编 ...