在我的代码中,我使用了一个小型数据存储类,它在不同的地方创建.为了避免内存泄漏并简化操作,我想使用引用计数,所以我做到了
type TFileInfo = class (TInterfacedObject,IInterface)
并删除了我对TFileInfo.Free的所有手动调用.不幸的是Delphi报告了很多内存泄漏.搜索SO我发现以下问题解释了为什么这不起作用:
Why aren’t descendants of TInterfacedObject garbage collected?
有一个解决方法,但它需要我(至少如果我做对了)编写一个自定义接口IFileInfo并为它提供了许多getter和setter,我想避免.
编辑我应该补充一点,我将创建的FileInfo对象插入到两种不同类型的哈希表中:一个来自TBucketList,另一个是来自Codegear论坛的哈希映射实现.在内部他们都是用户指针,所以情况就像在另一个问题中一样.
还有其他可能使Delphi中的对象使用引用计数吗?
解决方法
遗憾的是,只有在使用接口时(在您的情况下自定义接口IFileInfo),Delphi编译器才会为inc / dec引用计数生成必要的代码.此外,如果接口被强制转换为指针(或者TObject),那么也不能进行引用计数.例如,假设全局变量列表:TList:
var ifi : IFileInfo; begin ifi := TFileInfo.Create; list.Add(TFileInfo(ifi)); end;
方法返回后,list [list.Count – 1]将包含悬空指针.
因此,接口不能用于将它们转换为指针的hashmap,hashmap实现必须将它们保持为IInterface.