當我在析構函數中時,其他線程可能會開始執行對象的成員函數嗎?如何處理這種情況?析構函數與成員函數競賽
7
A
回答
17
C++在刪除對象後沒有內在的保護 - 忘記了競爭條件 - 另一個線程在完全刪除後可以使用對象。
或者:
- 確保只有一個地方在 代碼擁有的對象,這是 負責時,沒有人 是使用對象刪除。
- 使計數的 對象引用 - 通過加入 明確的引用計數代碼,或 找到一個合適的基類 實現引用計數
15
除非您確定沒有別的東西會嘗試使用它,否則您不應該破壞對象 - 理想情況下,沒有其他東西會引用它。當您致電刪除時,您需要更仔細地查看。
+0
完美,簡單的答案。更進一步,不僅可以在析構函數內發生這種情況,它可以在您離開析構函數之後發生。該語言無法修復糟糕的設計。 – 2009-01-20 17:06:57
+0
謝謝。不過,我應該建議Douglas Leeder的答案比我的更完整。 – DJClayworth 2009-01-21 22:03:50
2
如果你在因爲堆棧中異常展開的析構函數處理程序,我建議以這種方式重新排列代碼,以便在序列化塊中捕獲異常。
在塊之後,檢查對象是否仍然有效並調用您的方法。這樣,一個線程中的異常將允許其他線程正常處理對析構函數的調用。
相關問題
- 1. 成員構造函數和析構函數調用的順序
- 2. C++析構函數的成員變量?
- 3. 與析構函數
- 4. 正在從析構函數調用非成員函數嗎?
- 5. 運算符重載:成員函數與非成員函數?
- 6. C++ thread_local析構函數與pthread析構函數
- 7. 成員函數
- 8. unique_ptr成員,私人拷貝構造函數與移動構造函數
- 9. 構造函數和析構函數 - C++
- 10. 生成C++構造函數和析構函數與Eclipse UML插件紙莎草
- 11. 在構造函數初始化程序中使用成員的成員函數
- 12. C++中的構造函數和析構函數與C#比較
- 13. const成員函數
- 14. 在成員函數
- 15. 成員函數和
- 16. C++構造函數隱式成員
- 17. 結構成員上的模板函數
- 18. 構造函數中的成員函數指針
- 19. 成員函數的調用拷貝構造函數
- 20. 成員函數指針調用複製構造函數?
- 21. 我應該在構造函數中調用成員函數
- 22. 成員函數中的Python調用構造函數
- 23. mootools析構函數
- 24. Pcrecpp析構函數
- 25. WPF析構函數
- 26. Zend「析構函數」?
- 27. 在析構函數
- 28. boost ::函數賦值給成員函數
- 29. 函數中的類成員函數?
- 30. 成員函數隱藏自由函數
一個很好的提示是使用`boost :: shared_ptr <>`進行重新計數。它還支持`weak_ptr <>`或`enable_shared_from_this`這樣的構造,這使得生命週期管理的一些很好的部分非常容易。 – gimpf 2009-01-24 21:28:10