gpt4 book ai didi

delphi - 对象的引用计数

转载 作者:行者123 更新时间:2023-12-03 14:45:06 31 4
gpt4 key购买 nike

在我的代码中,我使用了一个小的数据存储类,它是在不同的地方创建的。为了避免内存泄漏并简化事情,我想使用引用计数,所以我这样做了

type TFileInfo = class (TInterfacedObject, IInterface)

并删除了我对 TFileInfo.Free 的所有手动调用。不幸的是,Delphi 报告了很多内存泄漏。搜索 SO 我发现以下问题解释了为什么这不起作用:

Why aren't descendants of TInterfacedObject garbage collected?

那里提出了一种解决方法,但它要求我(至少如果我做对的话)编写一个自定义接口(interface) IFileInfo 并为其提供大量 getter 和 setter,这是我想避免的。

编辑 我应该补充一点,我将创建的 FileInfo 对象插入到两种不同类型的哈希表中:一种来自 TBucketList,另一种是来自 Codegear 论坛的 HashMap 实现。在内部,它们都是用户指针,所以情况就像另一个问题一样。

还有其他可能性让 Delphi 中的对象使用引用计数吗?

最佳答案

只有当您仅通过接口(interface)引用实例时,Delphi 中的引用计数才有效。一旦你混合了接口(interface)引用和类引用,你就会遇到麻烦。

本质上,您想要引用计数,而不需要创建一个包含其中定义的所有方法和属性的接口(interface)。有三种方法可以做到这一点,这些方法大致按照我推荐的顺序排列。

  1. 巴里·凯利 (Barry Kelly) 写了一篇关于 Smart Pointers 的帖子。它使用 Delphi 2009 中的泛型,但我非常确定,如果您尚未使用 2009,您可以将其硬编码为您正在使用的类型的特定版本(顺便说一句,这是一个很棒的版本)。

  2. 另一种适用于更多版本的 Delphi 且修改较少的方法是 value type wrapper作者:Janez Atmapuri Makovsek。这是为 TStringList 实现的示例,但您可以将其改编为任何类型。

  3. 第三种方法是创建一个接口(interface)指针(类似于 Barry 的智能指针,但不那么智能)。我相信 JCL 里有一个,但具体细节我不太记得了。基本上,这是一个在构造时接受 TObject 引用的接口(interface)。然后,当它的引用计数达到零时,它会对您传递给它的对象调用 free 。此方法实际上仅适用于不作为参数传递的短期实例,因为您将引用计数的引用与实际使用的引用分开。我会推荐其他两种方法之一,但如果您更喜欢这种方法并需要更多信息,请告诉我。

这就是 Delphi 的特点,有一种免费的方式来完成事情。我认为选项#1 是最好的 - 获取 Delphi 2009 并使用该方法(如果可以的话)。

祝你好运!

关于delphi - 对象的引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/781100/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com