1

我有一个类似结构的图。我不确切知道何时以传统的 Delphi 方式销毁对象,相反我想实现类似引用计数对象之类的东西。我知道我可以使用 object.GetReference 和 object.Release 之类的东西来代替 Free,并使用私有变量进行引用计数,但有没有更好的方法?

谢谢

4

4 回答 4

15

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

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

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

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

于 2009-01-28T12:05:59.437 回答
3

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

于 2009-01-28T11:53:36.233 回答
2

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

最好的办法是让你的对象从 TInterfacedObject 继承。就像是

type
  IMyObject = interface
    [Guid]
  end;

  MyObject = class(IMyObject, TInterfacedObject)
  end;

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

myObject 变量是引用计数的,当它的引用计数下降到零时将被释放。

于 2009-01-28T11:55:33.547 回答
2

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

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

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

于 2009-01-28T19:41:08.800 回答