2011-02-26 62 views
1

在我目前的項目中,許多遺留代碼被設計爲使用引用計數。我知道它背後的基本理念。但我想提高我對這方面的知識,因爲我必須開始在日常編碼任務中使用引用計數。引用計數

有沒有一本好書或資源向我展示如何使用或如何設計一個好的框架/採用引用計數的類。

謝謝

+1

我能想到的最大和最流行的系統是使用引用計數作爲其資源管理策略是COM,它是Windows的一部分。可能想嘗試四處尋找資源(雖然,COM不僅僅是重新計數;) – 2011-02-26 22:16:40

+0

討厭陳述明顯但維基(http://en.wikipedia.org/wiki/Reference_counting)是一個良好的資源。 – Lou 2011-02-26 22:19:32

+0

我絕對同意@Mike。 COM引用計數是經過深思熟慮的,找到涵蓋引用計數中的線程安全以及如何處理週期等問題的實現相對比較容易。 – 2011-02-26 22:33:43

回答

0

什麼你可能已經看到的是侵入性引用計數其中類必須專門設計,以便它的對象可以被引用計數。如果您採用非侵入式引用計數代替boost::shared_ptr<T>,則不需要任何特殊的預防措施。

您可以閱讀current C++0x standard draftdocumentation at Boost或第20.9.10.2節。

+0

請注意,使用C++ 0x std :: make_shared,shared_ptr可以變得和插入式引用計數一樣高效。雖然承認這是一個QOI問題(實施不需要付出努力)。 – 2011-02-26 22:24:23

0

要添加到其他答案,請查看有關自定義刪除程序和管理COM對象的boost::shared_ptr手冊部分。當最後一個shared_ptr參考消失時,可以讓引用計數自動遞減,從而防止出現許多錯誤。您也可以使用boost::intrusive_ptr,它是爲具有自己引用計數管理的對象而設計的。

2

這很簡單,真的。

在你的結構中你有一個整數。當對象被分配它開始時爲1

如果你通過這些對象之一,你希望保留它比你的函數的壽命更長,可以通過1凹凸引用計數這是已知的作爲「持有參考」,並防止對象被釋放。例如,如果您將其插入到集合中,或將在稍後或另一個線程中使用它。 [注意:如果你在多個線程中使用它,你需要確保計數的增加/減少是用原子操作完成的。]

如果你是負責增加引用計數(或者如果你是一個誰首先分配了這個對象),當你不再需要這個指針時就減少引用計數,並且不關心它是否被釋放。

如果引用計數達到零,你去分配。

也有一些缺點,引用計數:

  • 你不能在他們的週期數據結構。如果A具有對B的引用並且B具有對A的引用,則A和B的引用將永遠不會歸零。有一些策略可以避免這種情況,但仍然具有圓形結構,但它們非常複雜。

  • 在多線程程序中,遞增和遞減需要原子讀取 - 修改 - 寫入指令,這可能會很慢。這是特別糟糕的,因爲使用引用計數的程序通常會非常頻繁地更改引用計數,並且在多個線程中使用原子操作是一個問題。

  • 出現問題時很難調試。您可以看到內存泄漏,雙免費或免費後使用,但是在崩潰時不恰當地修改引用帳號時不會立即清除內存泄漏。