原贴见:
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中