CnPack Forum


 
Subject: [bug] CnMemProof在d2010的误报
eGust
新警察
Rank: 1



UID 43547
Digest Posts 0
Credits 8
Posts 2
点点分 8
Reading Access 10
Registered 2009-9-16
Status Offline
Post at 2009-9-16 23:27  Profile | Blog | P.M. 
[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
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6772
Posts 3561
点点分 6772
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2009-9-17 22:51  Profile | Blog | P.M. 
感谢楼主的分析,我们查一下看看。
Top
 




All times are GMT++8, the time now is 2024-5-21 09:50

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.007418 second(s), 9 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP