用上FastMM4后打开FullDebugMode,每次都报内存泄漏错误,也因此纠正了不少问题。
可后来两个string泄漏的问题就找不出来了。
经过大范围地排查,最后集中在释放PCache对象上。TCache类是根据KOL.TObj来创建的,这种是标准的KOL创建方法,而里面仅仅有两个string,两个TDateTime,一个integer,首先排除掉TDateTime,integer,因为这是标准类型,而且fastmm生成的日志也指明是string型,怀疑就存在这两个string上面了。
可是实际上string是不需要释放的呀,因为delphi内建string类型,生存周期是由delphi来管理的,非常地安全可靠,现在却出现没释放的问题,真是奇怪。
不由得怀疑起TObj的问题来了。由于TObj不是delphi内建根对象,而KOL的根对象,因此delphi可能没有自动释放这些string,所以出现了内存泄漏。
而KOL可能没有考虑到这个问题,因此出现了泄漏的问题。
解决很简单,重载Destory,将两个string赋值成'’即可。虽然只有几十个字节,但也不能小看啊。
又仔细看了一下KOL的TObj注释
Disposes memory, allocated to an object. Does not release huge strings,
dynamic arrays and so on. Such memory should be freeing in overriden
destructor.
这是在Destory的原文,看来已经准备好不释放huge string了,原来不是人家的错,是我没看仔细。
而VCL中的TObject则在CleanupInstance 中将所有的huge string给释放了,看来还是人家的功底深啊。

浙公网安备 33010602011771号