如何确定内存泄漏的位置???

jougle 2003-06-14 11:19:01
用VC.net debug结果,出现:
detected memory leaks!
Dumping objects ->
{68} client block at 0x00F451D0, subtype c0, 2260 bytes long.
a CXYZThread object at $00F451D0, 2260 bytes long
Object dump complete.

线程 'Win32 线程' (0x834) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x380) 已退出,返回值为 0 (0x0)。
线程 'Win32 线程' (0x704) 已退出,返回值为 0 (0x0)。
程序“[1888] abc.exe: 本机”已退出,返回值为 0 (0x0)。

我检查很久,未能查出。有谁能用什么方法准确地确定是哪个变量没释放?
...全文
383 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
penter 2003-07-07
  • 打赏
  • 举报
回复
使用Microsoft Visual C++来检测和隔离内存泄漏
简介
具有动态的分配和释放内存的能力是C/C++程序语言的重要特色之一,但是中国的哲人孙子指出,最强有力的也是最脆弱的。对C/C++应用程序来说这当然是正确的,内存管理错误通常是bug起源之一。非常微妙且难于检测的bug之一就是内存 泄漏——不能正确地去分配已经分配了的内存。一个仅仅发生一次的轻微内存泄漏不可能引起注意,但是泄漏了大量内存或者日益增多的泄漏的程序可能表现出征兆,从可怜的(和慢慢地减少)性能到内存不足而完全失灵。更坏的是,一个有泄漏的程序可能占用很多的内存以至于导致另一个程序失灵,留给用户的只是对问题的一无所知。此外,一个严重的内存泄漏甚至可能是其他问题的征兆。

幸运的是,Visual C++ debugger 和 CRT库提供给你一系列有效的检测和鉴定内存泄漏的工具。这片文章阐述了如何使用这些工具去有效并系统的隔离内存泄漏。

设置内存泄漏检测
检测内存泄漏的基本工具是调试器和CRT调试堆函数。为了使用调试堆函数,在你的程序中你必须含有下面的说明:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include说明必须按顺序说明。如果你改变了顺序,你所用的函数可能不能正常工作。包含crtdbg.h的_malloc_dbg和 _free_dbg将 malloc和free函数映射到测试版中,它可以跟踪内存的分配和释放。这种映射仅仅在一个测试体系中发生(也就是说,仅仅当_DEBUG被定义的时候)。释放的体系使用通常的malloc和 free功能。

#define说明映射CRT堆函数的低级版本到相应的测试版本。这个说明是不需要的,但是没有它,内存泄漏处含有的只是没有多大用处的信息。

一旦你已经增加了刚才的说明,你能够通过在你的程序中包含下面的说明来释放内存信息:

_CrtDumpMemoryLeaks();
当你在调试情况下运行你的程序时,在输出窗口的Debug 标签处_CrtDumpMemoryLeaks表现出内存泄漏的信息。内存泄漏信息类似下面这样:

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.


如果你没有用#define _CRTDBG_MAP_ALLOC说明,内存漏洞堆存处类似下面这样:

Detected memory leaks!

Dumping objects ->

{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.


像你所知道的,当_CRTDBG_MAP_ALLOC被定义时,_CrtDumpMemoryLeaks给了你更多的有用信息。如果_CRTDBG_MAP_ALLOC没有被定义,那么将向你如下显示:

内存分配数值(花括号内)
模块的类型(normal、client或者CRT)
以十六进制格式定位的内存
以字节计模块的大小
第一个十六字节的内容(也可以用十六进制)
当定义了_CRTDBG_MAP_ALLOC的时候,显示的内容也向你展现了出现泄漏内存所分配地方的文件。在文件名之后括号内的数字(20,以此为例)是文件内的行数值。如果你双击包含行数值和文件名的输出行,

C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.

指针将会跳到源文件中内存被分配地方的行(在上面的情况下,leaktest.cpp的行号为20)。选择输出行并按F4将有同样的效果。

使用_CrtSetDbgFlag
如果你的程序总是在同一各地方存在,那么调用_CrtDumpMemoryLeaks时非常容易的。但是,如果你的程序需要在多个位置退出该怎么办?在每一个可能的出口处如果不调用_CrtDumpMemoryLeaks,你可在你的程序开始处包含下面的调用:

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

当你的程序退出时,这个说明自动地调用_CrtDumpMemoryLeaks。你必须设置两个位域,_CRTDBG_ALLOC_MEM_DF和 _CRTDBG_LEAK_CHECK_DF,像以前说明的一样。

翻译内存模块的类型
像早期声明的一样,内存泄漏信息鉴别泄漏内存的每一个模块作为一个普通的模块、一个客户模块或者一个CRT模块。实际上,普通的模块和客户模块是你可能留心的唯一类型。

一个普通模块(normal block)是由你的程序分配的普通内存。
一个客户模块(client block)是一种特殊的内存模块,它由于需要一个析构函数的对象而被Microsoft Foundation Classes (MFC)所使用。MFC new操作子建立一个普通模块或者一个客户模块,来适合被创建的模块。
一个CTR模块是由CRT库提供自己使用而分配的内存模块。CRT库对这些模块来管理自己的去分配,因此你不可能在内存泄漏报告中注意到这些,除非有些地方有严重的错误(例如,CRT库崩溃)。
在内存泄漏信息中有两种你从来没有见过的模块类型:

空闲模块(free block)是一种被释放的内存模块Ignore block是你已经特殊标记过以至于在内存泄漏报告中不会出现的模块。

上面的说明翻译自MSDN,不过不是我翻译的;

原文出处:http://expert.csdn.net/Expert/topic/1950/1950920.xml?temp=.6081201
o_racle 2003-07-04
  • 打赏
  • 举报
回复
gz

Richuen22 2003-07-03
  • 打赏
  • 举报
回复
boundcheck v7.0 内联到VC.NET中一起编译就可以查到了,它会弹出来说给你听的。
不过在那里下载就不知了,肯定的是已出了。
jvcit 2003-07-03
  • 打赏
  • 举报
回复
guan zhu
penter 2003-07-03
  • 打赏
  • 举报
回复
mark;
test2002 2003-06-22
  • 打赏
  • 举报
回复
使用AfxBeginThread(RUNTIME_CLASS(CMyThread));
也会内存泄露,不知道有什么方法补救
jougle 2003-06-21
  • 打赏
  • 举报
回复
up
wanghero 2003-06-16
  • 打赏
  • 举报
回复
up
pcitman 2003-06-16
  • 打赏
  • 举报
回复
这个问题我也常碰到,莫名其妙的
ooC2oo 2003-06-15
  • 打赏
  • 举报
回复
应该是线程没有delete造成的。
可是在创建时付值给cwinthread指针,主程序关闭时delete可。
jougle 2003-06-14
  • 打赏
  • 举报
回复
不是那个问题。
我随便创建一个窗口线程,只要主程序一关闭,就会出现内存泄漏。
如果主动关闭,比如添加一个按钮促发事件来关闭。则不会泄漏。
madmanahong 2003-06-14
  • 打赏
  • 举报
回复
双击提示检察new delete是否成对出现……
养成良好的习惯~
jougle 2003-06-14
  • 打赏
  • 举报
回复
发现线程一退出就会产生内存泄漏。诸位有什么好的解决方法没有?
alongzju 2003-06-14
  • 打赏
  • 举报
回复
装一个boundscheck

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧