Board logo

Subject: [bug] CnMemProof在d2010的误报 [Print This Page]

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

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

两处误报是 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中

Attachment: [LiteMemLeakReport by eGust] LiteMemLeakRep.zip (2009-9-16 23:27, 8.57 K) / Download count 373
http://bbs.cnpack.org/attachment.php?aid=690
Author: Passion    Time: 2009-9-17 22:51

感谢楼主的分析,我们查一下看看。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0