如何在Delphi中实现引用计数对象

时间:2009-01-28 11:32:08

标签: delphi object reference-counting

我有一个像结构的图表。我不确切知道何时以传统的Delphi方式销毁对象,而是想实现类似引用计数对象的东西。我知道我可以使用像object.GetReference和object.lease而不是Free,并使用私有变量进行引用计数,但还有更好的方法吗?

由于

4 个答案:

答案 0 :(得分:15)

如果您在确定Delphi程序中销毁标准对象的正确方法(位置,顺序等)时遇到问题,那么使用引用计数对象或接口将无助于您。

我知道您希望图中的节点保持彼此的引用,并且当没有对象的引用时,它应该被自动销毁。但考虑到两个节点每个都可以引用另一个节点的事实,并且引用计数永远不会再次达到0,因此永远不会释放这些对象。您需要手动中断至少一个引用/依赖项。如果你必须这样做,那么你也可以完全跳过引用计数。有关更多信息,请参阅维基百科有关weak references的文章。接口可以在Delphi中用于引用计数,但弱引用只能通过巧妙的类型转换来维护。有关示例,请参阅this source code and its comments

您可能想要探索的一个想法是保持对象的标准生命周期管理,让图形对象跟踪依赖关系。

让每个图形对象都有一个与其有连接的其他对象的列表。现在您可以简单地释放任何对象,列表的内务代码将删除对所有其他对象销毁的对象的所有引用。如果要修改图形,只需释放要删除的节点,即可更新依赖项。如果要销毁整个图形,只需销毁所有节点。基本上,您有一个节点列表(所有权,生命周期管理)和另一个用于描述图形的数据结构。

答案 1 :(得分:3)

您可以使用接口而不是对象,底层对象将自动引用计数,最好的是当refcount = 0时,delphi将为您销毁对象。

答案 2 :(得分:2)

您可能知道,Delphi没有垃圾收集器。

最好的办法是让你的对象来自TInterfacedObject。 像

这样的东西
type
  IMyObject = interface
    [Guid]
  end;

  MyObject = class(IMyObject, TInterfacedObject)
  end;

var
  myObject: IMyObject;
begin
  myObject := TMyObject.Create;
end

myObject变量是引用计数,当引用计数降为零时将被释放。

答案 3 :(得分:2)

如果您使用的是D2009,您可以使用Barry Kelly的智能指针实现。

http://barrkel.blogspot.com/2008/11/somewhat-more-efficient-smart-pointers.html

否则使用接口是最好的选择。使用您需要的所有功能创建一个接口,创建一个实现该接口的对象,然后从TInterfacedObject继承,然后在任何地方使用接口,而不是对象。

相关问题