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,问题解决。
欢迎提出更好的建议或分享其他看法。