织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 杂项技术 > VC(MFC) >

win32下 如何定位内存泄漏

落鹤生 发布于 2012-10-24 09:30 点击:次 
原理是一样的,利用重定义的new和__LINE__,__FILE__这两个宏, 每次的new都把对应地址,文件,行号等信息记录下来存入某个容器, delete的时候删除对应的信息,最后程序结束的时候检查容器中是否还有内容,如果有内容就是没有释放的内存。
TAG:

在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)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201210/16334.html]
本文出处:CSDN博客 作者:hhygcy
顶一下
(1)
50%
踩一下
(1)
50%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容