2010-11-07 232 views
1

我有一個設計,其中的對象同時擁有2個隊列。偶爾隊列本身可能會被刪除。在這種情況下,必須刪除隊列中的所有對象並將它們從其他隊列中刪除。引用計數智能指針刪除擁有的對象ref ref大於零?

當前解決方案擁有知道兩個擁有隊列的擁有對象,但這會引入醜陋的耦合。

有智能指針類可以幫助我嗎?構造可以是「新」或現有指針的副本。銷燬將刪除所擁有的資源。訪問將像weak_ptr一樣,提供指向null的可能性。

我想它可能需要一個特定的'銷燬'方法,以確保指針的臨時副本不釋放資源。

有沒有人知道這樣的事情?

感謝, 託尼

回答

1

你要排隊對象的缺失,從其他隊列中刪除它,沒有它連接到隊列中。

避免這種耦合的一種方法是將標記爲將對象移除,而不實際移除它。

  • 使用包裝對象作爲隊列的成員。邏輯排隊的對象有兩個包裝對象,每個隊列一個。
  • 每個包裝器在邏輯上包含一個boost :: shared_ptr對象,它是每個隊列的成員。
  • 包裝的析構函數邏輯排隊的對象標記爲死。
  • 從隊列中拉出項目時,忽略標記爲死的項目。
+0

謝謝。這聽起來不錯,但是如果一個隊列死掉,並且我們在另一個隊列中「掛起」包裝器(並且仍然是實際排隊的對象),它們何時被刪除?我想不是忽略已標記的死亡物品,而是刪除它們。 – 2010-11-07 23:46:11

+0

Probem在這裏將是如果一個隊列變得安靜但沒有被刪除。也許隊列可以定期搜索死對象。 – 2010-11-07 23:49:02

+0

您是否定期從每個隊列中拉出項目?如果是這樣,上述「何時」問題的答案是「當它們從另一個隊列中移除時。「在第二個評論中,」安靜「的意思是什麼? – 2010-11-08 00:10:25

0

一般而言,在存在參考週期的情況下,不存在引用計數的任何可重用解決方案。有解決方案,但它們要麼是特定於允許的參考週期模式,要麼是垃圾收集器。從描述問題的方式來看,您需要能夠找出給定隊列擁有什麼對象(以便您可以刪除隊列)以及擁有給定對象的隊列(因此​​您可以從所有隊列中刪除對象)。所以你有參考週期。

爲了解決醜陋的耦合問題,我建議讓隊列包含代理對象,每個代理對象都擁有真實的對象,並知道哪些隊列擁有它。隊列方法將使用並更新這些代理對象。

+0

感謝您的回答。我google了'參考週期'。我不相信循環是一個問題在這裏,雖然我明白了爲什麼它們會影響一般情況,因此爲什麼沒有通用的解決方案。 Andy的回答看起來有點像垃圾收集器,也許這是一條路。 – 2010-11-08 00:23:33

0

您可以使用boost::shared_ptr將對象存儲在隊列中。這是一個非常準確的非侵入式引用計數類。該圖書館還有一個weak_ptr類非擁有觀察。

+0

問題請求從一個隊列中刪除的對象也被「從其他隊列中刪除」。 – 2010-11-08 15:08:08

+0

什麼能夠防止一個隊列在銷燬期間從另一個隊列中取出其對象? – noxmetus 2010-11-08 18:30:08

+0

隊列必須彼此瞭解。具體來說,對於他們擁有的每個對象,他們需要一個指向另一個隊列的指針。 – 2010-11-08 23:00:44