C++中的shared_ptr
來解決一個問題,當多個對象獲取對象的所有權時會多次刪除。它通過僅使最後的刪除發生。
這個指針還有另外一個特點,那就是當一個對象想要所有權但不想延遲刪除,所以它需要一個弱指針,當它被刪除時通知他以防止出現問題。
還有另一種方法做到這一點。不要只做最後一次刪除,而只會發生第一次刪除,其他對象應該被通知它發生了,就像弱指針一樣。
這對像連接這樣的對象很有用,如果一端釋放它,它應該被銷燬,而另一端知道這個。
在C++或Boost中是否有類似的東西?另一種共享所有權
Q
另一種共享所有權
0
A
回答
0
這種模式可以用一個共享的,互斥的shared_ptr
來模擬,只用於創建和銷燬該對象,並且用於訪問的每個客戶端/端點的weak_ptr
。
請注意,這樣的方案會導致過度鎖定,並可能不會提供所需的語義。在使用過程中,您需要lock
weak_ptr
,其中涉及shared_ptr
內部互斥鎖。當一方破壞主實例shared_ptr
時,對象在任何讀取操作完成時仍然存在。
更傳統的解決方案是通過信道本身發送掛斷消息。
0
有幾種類型的通知:
- 同步
- 異步
- 點播(不是一個真正的通知)
取決於你真正想要的,在實施可能會有很大差異。
後者(按需)通過典型的shared_ptr
/weak_ptr
二分法已可用:通過weak_ptr
訪問對象時,您將知道它是否已被刪除。
另外兩個可以通過傳統的shared_ptr
之上的觀察者模式來實現,但是它們具有複雜性和性能的後果,所以我會在使用它們之前確保需求是真實的。
相關問題
- 1. 設置共享基於安全權限的共享中共享所有文件夾的權限
- 2. 不與共享庫共享所有類
- 3. 使用wget將所有內容從一臺共享服務器轉移到另一臺共享服務器上?
- 4. 通過動態數組共享所有權
- 5. 共享升壓的所有權::施工後的shared_ptr
- 6. 網絡共享上的文件所有者權限
- 7. 共享日曆所有權和管理用戶
- 8. 共享所有權雙倍免費錯誤
- 9. Samba共享權限問題 - 僅限文件系統權限的公共共享
- 10. 鏈接共享庫可執行與另一個共享庫
- 11. 鏈接共享庫與Linux中的另一個共享庫
- 12. 鏈接到另一個共享對象的共享對象
- 13. 創建另一個共享庫時鏈接共享庫
- 14. OCaml爲另一個共享庫共享lib
- 15. 使用另一個共享庫創建共享庫
- 16. 幾個類共享的一種方法
- 17. 共享點是一種雲計算?
- 18. asp.net和共享的權限
- 19. Tensorflow seq2seq權重共享
- 20. 共享文件夾權限!
- 21. Google腳本共享權限
- 22. 共享兩種途徑
- 23. ec2與另一個帳戶共享ami
- 24. Objective-C ARC - 分享所有權
- 25. 共享所有網頁的config.js(require.js)?
- 26. 更改共享所有者C#
- 27. 訪問所有共享對象AS3
- 28. EWS - 訪問所有共享日曆
- 29. 與所有存儲庫共享NpgsqlConnection
- 30. 共享UIWebView的所有視圖
難道你不能實現一個簡單的指針包裝器,檢查它是否指向一個空的內存地址,然後再使用它?因此,如果任何對象銷燬指針,即使它指向一個NULL位置,則所有其他對象都會知道該指針已被刪除。 – 2012-04-28 13:22:25
雖然一個封裝ptr的smart-ptr爲單線程案例解決了這個問題,但線程安全的解決方案相當複雜一些...... BTW:對問題的回答是否定的。 – 2012-04-28 13:25:23
你可以從對象的析構函數發出一個信號。請參閱Boost.Signals – rmflow 2012-04-28 13:26:49