2012-04-28 74 views
0

C++中的shared_ptr來解決一個問題,當多個對象獲取對象的所有權時會多次刪除。它通過僅使最後的刪除發生。
這個指針還有另外一個特點,那就是當一個對象想要所有權但不想延遲刪除,所以它需要一個弱指針,當它被刪除時通知他以防止出現問題。
還有另一種方法做到這一點。不要只做最後一次刪除,而只會發生第一次刪除,其他對象應該被通知它發生了,就像弱指針一樣。
這對像連接這樣的對象很有用,如果一端釋放它,它應該被銷燬,而另一端知道這個。
在C++或Boost中是否有類似的東西?另一種共享所有權

+0

難道你不能實現一個簡單的指針包裝器,檢查它是否指向一個空的內存地址,然後再使用它?因此,如果任何對象銷燬指針,即使它指向一個NULL位置,則所有其他對象都會知道該指針已被刪除。 – 2012-04-28 13:22:25

+0

雖然一個封裝ptr的smart-ptr爲單線程案例解決了這個問題,但線程安全的解決方案相當複雜一些...... BTW:對問題的回答是否定的。 – 2012-04-28 13:25:23

+0

你可以從對象的析構函數發出一個信號。請參閱Boost.Signals – rmflow 2012-04-28 13:26:49

回答

0

這種模式可以用一個共享的,互斥的shared_ptr來模擬,只用於創建和銷燬該對象,並且用於訪問的每個客戶端/端點的weak_ptr

請注意,這樣的方案會導致過度鎖定,並可能不會提供所需的語義。在使用過程中,您需要lockweak_ptr,其中涉及shared_ptr內部互斥鎖。當一方破壞主實例shared_ptr時,對象在任何讀取操作完成時仍然存在。

更傳統的解決方案是通過信道本身發送掛斷消息。

0

有幾種類型的通知

  • 同步
  • 異步
  • 點播(不是一個真正的通知)

取決於你真正想要的,在實施可能會有很大差異。

後者(按需)通過典型的shared_ptr/weak_ptr二分法已可用:通過weak_ptr訪問對象時,您將知道它是否已被刪除。

另外兩個可以通過傳統的shared_ptr之上的觀察者模式來實現,但是它們具有複雜性和性能的後果,所以我會在使用它們之前確保需求是真實的。