程序有内存泄露,怎样才能定位到具体泄露的语句啊?


我的一个工程很大,是用VS2005开发的,现在运行发现有内存泄露,但Output窗口输出的泄露信息没办法定位到究竟哪一行语句导致泄露了,具体提示信息如下所示:

etected memory leaks!
Dumping objects ->
{1489} normal block at 0x01E40838, 172 bytes long.
 Data: <                > D0 B4 92 00 00 00 00 00 00 00 00 00 CD CD CD CD 
{1488} normal block at 0x01E407D8, 32 bytes long.
 Data: <DTV_192.168.100.> 44 54 56 5F 31 39 32 2E 31 36 38 2E 31 30 30 2E 
{1486} normal block at 0x01E406B0, 136 bytes long.
 Data: <                > F4 AF 92 00 00 00 00 00 00 00 00 00 00 00 00 00 
{1474} normal block at 0x01E40560, 1 bytes long.
 Data: < > CD 
Object dump complete.

请问,有没有什么办法定位到具体的泄露语句啊?

16 个解决方案

#1


leakdiag

#2


没有别的了吗?

#3


应该不能定义到那一句吧。。

#4


使用VS肯定不能找到具体是哪里的。。
leakdiag很好~

#5


Assists in finding memory leaks.
#define new DEBUG_NEW 
 

#6


很难呀。。。

#7


搜索分配内存的地方嘛

#8


通过new分配的内存在显示信息时会报告出在那一个文件的那一行进行的new操作,而通过malloc分配的内存则仅仅是显示出内存泄露的信息而无法定位分配内存的程序位置。 

此外如果需要在文件头部定义DEBUG_NEW宏才可以正确的跟踪new操作。具体代码如下: 

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

由于对new操作的跟踪只需要在调试版本中出现所以使用了条件编译。 

我们可以看到VC所提供的检查内存泄露的方式是非常易于使用的,我们在开发程序时一定要注意内存的分配问题,特别是对于一些长时间运行的程序。

#9


打开 调用堆栈 窗口查看

#10


我使用LeakDiag时怎么还是获取不到泄露信息啊,我是参照
http://www.cppblog.com/sandy/archive/2008/08/18/59260.html
上面介绍的步骤执行的。
我怀疑是我的操作步骤有问题,我是这样操作的。

1  先运行程序,在任务管理器中会出现aaa.exe进程;

2  启动LeakDiag,选择“Windows Heap Allocator”,然后选择"start",过几秒钟选择“log”,然后选择“stop”,这是在C:\Leakdiag\Logs目录下会出现一个xml文件;

3  将程序aaa.pdb文件的路径“D:\LeadDiag\Debug\aaa.pdb”添加到“[Tools]-[Option]-Symbol search path”编辑框中;

4  然后选择"start",过几秒钟选择“log”,然后选择“stop”,这是在C:\Leakdiag\Logs目录下会出现另一个xml文件;

但我打开xml文件却看不到泄露信息,是不是我的操作步骤有问题?

#11


output 只能查找到,退出没有释放的。很多内存会在退出时被删除,所以输出窗口查不出来。

使用 BoundCheck 之类的工具动态监视程序运行中类的数量。看看哪个地异常增长。

#12


通过new分配的内存在显示信息时会报告出在那一个文件的那一行进行的new操作,而通过malloc分配的内存则仅仅是显示出内存泄露的信息而无法定位分配内存的程序位置。  

此外如果需要在文件头部定义DEBUG_NEW宏才可以正确的跟踪new操作。具体代码如下:  

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

由于对new操作的跟踪只需要在调试版本中出现所以使用了条件编译。  

我们可以看到VC所提供的检查内存泄露的方式是非常易于使用的,我们在开发程序时一定要注意内存的分配问题,特别是对于一些长时间运行的程序。

#13


关注。。。

#14


打开的HANDLE要close掉,new完要delete

#15


http://www.crazyctime.com/read.php?tid=127&keyword=%E5%86%85%E5%AD%98

#16


{1486} normal block at 0x01E406B0, 136 bytes long.

你调试的时候,定位到那个地址。然后根据调用栈看看代码。
另外vc有个语句貌似专门调试内存的(类似DebugBreak的功能)具体忘记了抱歉。

不过就是定位地址就OK。

其他的就是找找工具了。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com