BDS2006的内存泄漏?bug?

BDS2006的内存泄漏?bug?

基本情况:

  在DLL中封装一个form,form上放置一个panel

外部exe只要通过接口创建一次此from,无论你怎么释放,FastMM都会报出一个:

 

109-124 bytes: Unknown ×1


一个不知道是什么类型的内存块泄漏。


这种内存泄漏太不爽了,根本不能直接看出哪儿出的问题,我后来通过fastMM直接跟踪内存分

配和释放的过程,

发现了有一个对象很可疑InternalServices在themes.pas单元,仔细跟了几次知道就是这

个东东出的问题

它被多次重建,但是就释放了一次。

最后我通过和delphi7中的单元对比,发现2006中释放的时多了一个条件语句:
系统单元:Themes.pas文件中结尾

initialization

finalization

  if not IsLibrary then //就是这句导致了内存泄漏

    InternalServices.Free;

end.

以前我和同事yangc就讨论和研究过dll中单件对象的实现问题,

知道这个由于exe和dll中都创建了InternalServices对象

而这个看似单件的对象实际是两个不同的对象实例。没想到delphi源码中也存在此bug。


知道原因了,解决方法就好说了:

1.     由于和delphi7单元就这么一句不同,猜想可以修改themes.pas源码,编译出新的dcu覆盖系统不出现问题

风险:大,不稳定

2.     自己copy出一份themes.pas源码放到自己的项目中,修改之使用。风险:有,稍稳定,但也不能避免其他项目不出现此问题

3.     带包编译,这样就保证了两个对象是相同的了。风险:小,稳定


最后这个问题,我们选择了3,问题解决。

 欢迎提出更好的建议或分享其他看法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值