寻找内存泄漏 ( 积分: 50 )

  • 主题发起人 主题发起人 ddzhouqian
  • 开始时间 开始时间
D

ddzhouqian

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,开发程序中遇到不定期的异常报错,在网上搜了下,说是可能内存分配释放有问题,修复代码后仍然发现有此问题,于是找了个MemoryManager.pas,用了后,果然出现有内存泄漏,但看了半天看不懂,哪有问题?求各位对这方面有研究或者有兴趣的富翁给小弟些建议,帮忙分析下.呵呵,多谢了
===== Explorer.EXE,2007-7-3 12:10:47 =====

可用地址空间 : 1024 KB(1048576 Byte)
未提交部分 : 1008 KB(1032192 Byte)
已提交部分 : 16 KB(16384 Byte)
空闲部分 : 13 KB(14172 Byte)
已分配部分 : 1 KB(1880 Byte)
全部小空闲内存块 : 0 KB(232 Byte)
全部大空闲内存块 : 13 KB(13940 Byte)
其它未用内存块 : 0 KB(0 Byte)
内存管理器消耗 : 0 KB(332 Byte)
地址空间载入 : 0%

当前出现 1 处内存漏洞 :
0) 0000000006462C60 - 27($001B)字节 - 不是对象
 
我顶起来,希望各位老大能与指点!
 
我也在开发程序中遇到不定期的异常报错,请那位老大看看,或者给个可能性分析,顶。
 
这种是自己处理不当造成的,我就有这样子做的
比如没有判断存在不存在就去读一个东西的,考虑不全面,你的才一个,我的都6个呢
还有就是如果引用了MIDASLIB单元就会有,还有DBCLIENT,SCONNECT,MCONNECT,等等这些都无法解释了,再有像WEBBROWSER就存在漏洞,网上也有人说,我自己也遇到,不知道怎么解决,再仔细看一下自己的代码
 
也可能是误报,也可能是MIDAS本身,比如这个
我只加入了判断单元和MIDASLIB,但还是有个错
program Project1;

uses
MemoryManager in 'MemoryManager.pas',
midaslib,
Forms;

{$R *.res}

begin
Application.Initialize;
Application.Run;
end.

===== Project1.exe,2007-7-4 9:50:24 =====

可用地址空间 : 1024 KB(1048576 Byte)
未提交部分 : 1008 KB(1032192 Byte)
已提交部分 : 16 KB(16384 Byte)
空闲部分 : 13 KB(14068 Byte)
已分配部分 : 1 KB(1988 Byte)
全部小空闲内存块 : 0 KB(728 Byte)
全部大空闲内存块 : 0 KB(0 Byte)
其它未用内存块 : 13 KB(13340 Byte)
内存管理器消耗 : 0 KB(328 Byte)
地址空间载入 : 0%

当前出现 1 处内存漏洞 :
0) 00000000009D0B00 - 135($0087)字节 - 不是对象
 
调试的时候,可以试着一个控件一个控件,一个单元一个单元调试,去掉这个控件后,看看还有没有这个漏洞,如果没有了,说明是这个控件的事,还有就是第三方的控件要仔细地查
 
用FastMM的内存管理查内存泄漏,能给出更详细的信息.
例如泄露的数据是什么类型的之类的
 
to asksomeone:调试的时候测试?有些问题是经过若干次窗体切换,或者是逻辑上的变化才能找到的,一时半会找不到规律的,所以此方法不是很理想的.
to wr960204:FastMM可以定位到是什么类型的数据?是这些吗?
TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat,
tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString,
tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray);
如果是,那么MemoryManager.pas这个也是可以的
 
MemoryManager.pas功能还是弱了些.我以前做了一个和它差不多的东西.后来看到FastMM后就放弃了.FastMM可以获得的类型信息非常强.
 
后退
顶部