CnPack Forum » CnPack IDE 专家包(CnWizards) » [bug] CnMemProof在d2010的误报


2009-9-16 23:27 eGust
[bug] CnMemProof在d2010的误报

原贴见:[url=http://bbs.2ccc.com/topic.asp?topicid=334804]http://bbs.2ccc.com/topic.asp?topicid=334804[/url]

两处误报是 TUTF8Encoding 和 TMBCSEncoding,由于CnMemProf的引用列表中有SysUtils,所以
uses
  CnMemProf,
  Forms,
  ...
begin
  ...
  Application.CreateForm(TForm1, Form1);
  ...
的执行顺序是:
...
SysUtils.initialization
CnMemProf.initialization
...
Application.CreateForm(TForm1, Form1);
...
CnMemProf.finalization
SysUtils.finalization
...

而 Application.CreateForm(TForm1, Form1) 会调用 TForm1.Create,然后调用 TReader 从资源中读取 .dfm 内容。
在d2010中,TReader.ReadStr 和 TReader.ReadString 分别会调用 TEncoding.UTF8(GetUTF8) 和 TEncoding.Default(GetDefalt),于是一个 TUTF8Encoding 和一个 TMBCSEncoding 都被创建了。也就是说,这两个对象是在 CnMemProf.initialization 之后创建的,CnMemProf 已经替换了 memory manager。
但在程序结束的时候,这两个对象的释放却是在 class destructor TEncoding.Destroy 中,而 class destructor 比所在 unit 的 finalization 发生的还要晚。所以当 CnMemProf 在 finalization 中报告发生 leak 的时候,连 SysUtils.finalization 还都没有发生,所以这两个对象会被误报。

btw,我设计了一个可以在d2010正确报告的mm,并且提供了提示内存泄露代码地址的功能,我觉得还是发出来让更有精力的人维护和加强比较好,也希望可以放到cnpack中

2009-9-17 22:51 Passion
感谢楼主的分析,我们查一下看看。

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.