加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 对象的引用计数

发布时间:2020-12-15 04:09:48 所属栏目:大数据 来源:网络整理
导读:在我的代码中,我使用了一个小型数据存储类,它在不同的地方创建.为了避免内存泄漏并简化操作,我想使用引用计数,所以我做到了 type TFileInfo = class (TInterfacedObject,IInterface) 并删除了我对TFileInfo.Free的所有手动调用.不幸的是Delphi报告了很多内存
在我的代码中,我使用了一个小型数据存储类,它在不同的地方创建.为了避免内存泄漏并简化操作,我想使用引用计数,所以我做到了
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读