2009-01-28 54 views
1

我有一個類似於結構的圖。我不知道什麼時候以傳統的Delphi方式銷燬對象,而是我想實現像引用計數對象之類的東西。我知道我可以使用像object.GetReference和object.Release這樣的東西來代替Free,並使用一個私有變量作爲引用計數,但是有沒有更好的方法?如何在Delphi中實現引用計數的對象

感謝

回答

15

如果您在確定在Delphi程序中銷燬標準對象的正確方法(地點,順序等)時遇到問題,那麼使用引用計數的對象或接口根本無法幫助您。

我知道您希望圖中的節點保持彼此的引用,並且當沒有引用留給對象時,它應該被自動銷燬。但是考慮一下這樣一個事實,即兩個節點都可以有一個對另一個節點的引用,並且引用計數不會再次達到0,這樣這些對象將永遠不會被釋放。您將需要手動中斷至少一個引用/依賴關係。如果你必須這樣做,那麼你完全可以跳過引用計數。有關更多信息,請參閱維基百科有關weak references的文章。 Delphi中可以使用接口來進行引用計數,但只能使用巧妙的類型轉換才能保持弱引用。有關示例,請參閱this source code and its comments

您可能想要探索的一個想法是保持對象的標準生命週期管理,並讓圖形對象跟蹤相關性。

讓每個圖形對象都有一個與它有連接的其他對象的列表。現在,您可以簡單地釋放任何對象,並且列表的管家代碼將刪除所有對所有其他對象銷燬的對象的引用。如果您想修改圖形,只需釋放要移除的節點,並且依賴關係將被更新。如果你想破壞整個圖形,只需銷燬所有節點。基本上你有一個節點列表(所有權,生命週期管理)和另一個描述圖形的數據結構。

+1

+1此問題的答案最全。如果所有的孩子都是父母所有,那麼請參閱http://stackoverflow.com/questions/171730/interface-recursion-and-reference-counting以獲得更簡單的解決方案。 – 2012-02-01 17:30:09

3

可以使用接口,而不是對象,墊層對象將自動引用計數,最好的事情是,德爾福將摧毀對象爲你,當引用計數= 0

2

正如你可能知道,德爾福沒有垃圾收集器。

你最好打賭會讓你的對象從TInterfacedObject下降。 喜歡的東西

type 
    IMyObject = interface 
    [Guid] 
    end; 

    MyObject = class(IMyObject, TInterfacedObject) 
    end; 

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

的myObject的變量是參考計數,當其引用計數下降到零將被釋放。

2

如果您使用的是D2009,則可以使用Barry Kelly的智能指針實現。

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

否則使用接口是你最好的選擇。用你需要的所有功能創建一個接口,創建一個實現該接口的對象,並從TInterfacedObject繼承,然後到處使用接口,而不是對象。

+0

注意:在圖形結構中任何地方使用智能指針或接口都會產生循環引用的問題。這些需要手動分解,或者需要使用弱引用。 – mghie 2009-01-31 18:41:48

相關問題