VS2008中捕获内存泄露(转)

内存泄露十分讨厌,捕获内存泄露更加令人厌烦……

其实,VS本身就有内存泄露的检测机制。只需做以下操作即可开启。(同时必须在debug模式 下运行程序并且以 正常流程退出 )

view plaincopy to clipboard

  1. // 在入口函数cpp中添加以下定义和头文件
  2. #define CRTDBG_MAP_ALLOC
  3. #include <stdlib.h>
  4. #include <crtdbg.h>
  5. // 在入口函数一开始添加以下代码
  6. _CrtDumpMemoryLeaks();
  7. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

[cpp] view plaincopy

  1. // 在入口函数cpp中添加以下定义和头文件
  2. #define CRTDBG_MAP_ALLOC
  3. #include <stdlib.h>
  4. #include <crtdbg.h>
  5. // 在入口函数一开始添加以下代码
  6. _CrtDumpMemoryLeaks();
  7. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

然后在以 正常流程退出 程序后, 就会在输出窗口显示出内存泄露的信息了。

注意!重点来了。

虽然VS检测出来了哪里有了内存泄露, 但是有可能你得到的有效信息只有两个 (如下)

1. 未释放的内存大小。(绿色部分 )

2. 这块内存是程序中总计第几个被申请的。(蓝色部分 )。

3. 而申请空间所在代码的位置可能不会被显示(删除线部分 )。

Detected memory leaks! Dumping objects -> C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18 }
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

那么, 如果出现了这种情况, 其实是根本无法知道哪里出了问题。那么这个时候该怎么办呢?

这个时候需要使用这个函数。

view plaincopy to clipboard

  1. //num就是刚刚检测出来的内存泄露的地方大括号内的数字
  2. _CrtSetBreakAlloc(num);

[cpp] view plaincopy

  1. //num就是刚刚检测出来的内存泄露的地方大括号内的数字
  2. _CrtSetBreakAlloc(num);

这个函数的作用是,在你运行程序的时候,会在第num次申请空间时断点。

所以,你需要重新运行一遍程序 。(只要流程一样,内存申请顺序肯定是一样的,所以会正确的在需要的地方断掉。)

注意,之前提示的内存泄露中大括号内的数值就是指的第几次申请的空间泄露了。

这个时候查看堆栈调用 ,即可知道到底是在哪里申请了内存但是忘记释放掉了。然后将这块内存在合适的时候释放掉就行了。

时间: 2024-11-08 23:37:34

VS2008中捕获内存泄露(转)的相关文章

VS中捕获内存泄露

VS中捕获内存泄露 内存泄露十分讨厌,捕获内存泄露更加令人厌烦-- 其实,VS本身就有内存泄露的检测机制.只需做以下操作即可开启.(同时必须在debug模式 下运行程序并且以 正常流程退出 ) // 在入口函数cpp中添加以下定义和头文件 #define CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> // 在入口函数一开始添加以下代码 _CrtDumpMemoryLeaks(); _CrtSetDbgFlag ( 

查找并修复Android中的内存泄露—OutOfMemoryError

[编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 OneAPM 编译呈现,以下为正文. Android 程序中很容易出现内存泄露问题.毫无戒心的开发者可能每天都会造成一些内存泄露,却不自知.你可能从未注意过这类错误,或者甚至都不知道它们的存在.直到你遇到下面这样的异常: java.lang.OutOfMemoryError: Failed to allo

Java中的内存泄露 和 JVM GC(垃圾回收机制)

一.什么是Java中的内存泄露? 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点, 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连:其次,这些对象是无用的,即程序以后不会再使用这些对象. 如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存. 在C++中,内存泄漏的范围更大一些.有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来. 在Java中,这些不可达的对象都由GC负

Java中的内存泄露的几种可能

Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导致不能被回收,这就是Java中内存泄漏的发生场景. 造成内存泄漏的几种情况: 1.静态集合类引起内存泄漏 像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,他们所引用的所有的对

android中的内存泄露查找与常见的内存泄露案例分析

常见的内存泄露查找方法请参见:http://hukai.me/android-performance-patterns/ 这篇文章是google发布的android性能优化典范示例,对于渲染.内存GC与电量消耗都做了好的示范. 这里我总结了下,android中常见的内存泄露 1.类中调用registerReceiver后未调用unregisterReceiver(). 在调用registerReceiver后,若未调用unregisterReceiver,其所占的内存是相当大的. 这种情况常见于

[Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露

本文将演示使用Instruments Allocations工具检测应用程序中的内存泄漏问题. 内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. 内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光. 在项目文件夹[DemoApp]上点击鼠标

在VC++中启用内存泄露检测

检测内存泄漏的主要工具是调试器和 CRT 调试堆函数.若要启用调试堆函数,请在程序中包括以下语句: #define CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h> 注意   #include 语句必须采用上文所示顺序.如果更改了顺序,所使用的函数可能无法正确工作. 通过包括 crtdbg.h,将 malloc 和 free 函数映射到其“Debug”版本 _malloc_dbg 和 _free_dbg,这些函数将跟踪内存

ARC 误区 Core Foundation 中的内存泄露

ARC :只会对oc 对象进行内存管理,即:苹果有句名言:ARC is only for NSObject. 但是对c对象或是CG开头的对象,即存在于 Core Foundation框架 (CoreFoundation.framework 是一组C语言接口)中的对象无效,需要手动的retain 和release. 例如:CGImageRef 也是一个Image的指针,ARC不会进行处理. 使用ARC的项目,一般内存泄漏都是malloc.自定义结构.资源引起的,多注意这些地方进行分析. 例: 1

_CrtDumpMemoryLeaks报告程序中的内存泄露问题(简单示例代码)

// .h 文件 #pragma once class CConsoleDump { public: explicit CConsoleDump(LPCTSTR lpszWindowTitle = NULL); virtual ~CConsoleDump(void); public: BOOL DUMP(LPCTSTR lpszFmt, ...); BOOL ShowWindow(BOOL bShowWindow); BOOL SetWindowText(LPCTSTR lpszWindowTi