2009-01-20 42 views

回答

17

C++在刪除對象後沒有內在的保護 - 忘記了競爭條件 - 另一個線程在完全刪除後可以使用對象。

或者:

  1. 確保只有一個地方在 代碼擁有的對象,這是 負責時,沒有人 是使用對象刪除。
  2. 使計數的 對象引用 - 通過加入 明確的引用計數代碼,或 找到一個合適的基類 實現引用計數
+0

一個很好的提示是使用`boost :: shared_ptr <>`進行重新計數。它還支持`weak_ptr <>`或`enable_shared_from_this`這樣的構造,這使得生命週期管理的一些很好的部分非常容易。 – gimpf 2009-01-24 21:28:10

15

除非您確定沒有別的東西會嘗試使用它,否則您不應該破壞對象 - 理想情況下,沒有其他東西會引用它。當您致電刪除時,您需要更仔細地查看。

+0

完美,簡單的答案。更進一步,不僅可以在析構函數內發生這種情況,它可以在您離開析構函數之後發生。該語言無法修復糟糕的設計。 – 2009-01-20 17:06:57

+0

謝謝。不過,我應該建議Douglas Leeder的答案比我的更完整。 – DJClayworth 2009-01-21 22:03:50

2

如果你在因爲堆棧中異常展開的析構函數處理程序,我建議以這種方式重新排列代碼,以便在序列化塊中捕獲異常。

在塊之後,檢查對象是否仍然有效並調用您的方法。這樣,一個線程中的異常將允許其他線程正常處理對析構函數的調用。