win32下 如何定位内存泄漏

来源:互联网 发布:stm8单片机视频教程 编辑:程序博客网 时间:2024/06/06 05:01

在mobile平台上写代码久了,平时的时候都是自己给出检索内存泄漏的方案的。但是在win32下的开发,内存泄漏的检索式如此的简单。在 windows下,定义有这样一个宏_CrtDumpMemoryLeaks。它可以帮助你在任何地方打印出当年的内存使用情况,比如说当前有多少内存使 用了没有被释放掉。

比如说你有这样一段程序:

  1. int main (void
  2.     int* p = new int[100]; 
  3.     _CrtDumpMemoryLeaks(); 

如果执行以下,在输出里面可以看到这样的一段文字:

Detected memory leaks!
Dumping objects ->
{86} normal block at 0x003A6C10, 400 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

 

很高级啊!至少到这一步,你知道了这里有内存泄漏了(当然实际上这里的例子进程结束的时候,系统还是会把这块内存回收的),如果我们想进一步地看到 具体哪一行分配的内存呢?这个更高级一点,就需要多做点事情了。首先你要定义一个新的头文件,用它来重定义一下new操作符,下面就是这个

  1. #ifdef _DEBUG 
  2. #include <crtdbg.h> 
  3. #define DEBUG_NEW new(_NORMAL_BLOCK ,__FILE__, __LINE__) 
  4. #else 
  5. #define DEBUG_NEW new 
  6. #endif 

现在你的程序也做一下改动:

  1. #ifdef _DEBUG 
  2. #include "MyMemoryNew.h" 
  3. #define new DEBUG_NEW 
  4. #endif 
  5. int main (void
  6.     int* p = new int[100]; 
  7.     _CrtDumpMemoryLeaks(); 

当然啦#include一下我们的新头文件,然后定义一下new。okay运行一把,这个时候的输出就不同了:

Detected memory leaks!
Dumping objects ->
c:/project/testapplication/greedy algorithm/ga/dijkstra_algorithm/dijkstra_algorithm.cpp(137) : {86} normal block at 0x003A6C10, 400 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

可以看到,不仅告诉你了有内存没有删除,同时还有了具体的行号!这样给我们的unittest带来比较大的便利。所以如果是一下逻辑上的模块,如果可以的话可以让他在win32下面跑,测试,等到没有内存问题了,在搬回到移动平台上!这样就可以避免讨厌的内存问题。

当然如果你想一劳永逸的在移动平台上弄也可以,有好事者在code project上面给出了一个wince版本的crtdbg.h,当然原理是一样的,利用重定义的new和__LINE__,__FILE__这两个宏, 每次的new都把对应地址,文件,行号等信息记录下来存入某个容器, delete的时候删除对应的信息,最后程序结束的时候检查容器中是否还有内容,如果有内容就是没有释放的内存。这样的容器自己实现也是比较简单的,那个 code project上的链接在这里 http://www.codeproject.com/KB/mobile/ce_crtdbg.aspx。有空可以再看看。

(hhygcy)