【问题标题】:How to implement reference counted objects in Delphi如何在 Delphi 中实现引用计数对象
【发布时间】:2009-01-28 11:32:07
【问题描述】:

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

谢谢

【问题讨论】:

    标签: delphi object reference-counting


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 当心:在图形结构的任何地方使用智能指针或接口都会产生循环引用问题。这些需要手动分解,或者也需要使用弱引用。
      【解决方案4】:

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

      最好的办法是让你的对象从 TInterfacedObject 继承。 类似的东西

      type
        IMyObject = interface
          [Guid]
        end;
      
        MyObject = class(IMyObject, TInterfacedObject)
        end;
      
      var
        myObject: IMyObject;
      begin
        myObject := TMyObject.Create;
      end
      

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

      【讨论】:

        猜你喜欢
        • 2014-04-07
        • 1970-01-01
        • 2016-03-14
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2015-11-01
        • 2011-03-29
        • 1970-01-01
        相关资源
        最近更新 更多