條款11 在operator 中處理」自我賦值「

2021-06-23 07:07:04 字數 1247 閱讀 2781

(一)有別名的存在,所以有可能自我賦值。

下面的**不具備自我賦值的安全性 也不具備 異常安全性

class bitmap ;

class widget ;

widget& widget::operator=(const widget& rhs)

自我賦值的話, 呼叫的物件和傳入的引數是同乙個物件,*this 跟rhs是同乙個物件。那麼delete pb,那麼唯一的物件就被銷毀了。

在函式末尾,該物件pb發現自己持有的是乙個指標指向乙個已被刪除的物件。

阻止這種錯誤的方法是(在賦值函式前面加乙個」正同測試「)

class bitmap ;

class widget ;

widget& widget::operator=(const widget& rhs)

具備」自我賦值安全性「 卻不具備」異常安全性「。如果new bitmap導致異常(無論new 記憶體或者copy)widget最終會持有乙個指標指向一塊被刪除的bitmap

解決這個問題的方法(處理 異常安全性的同時也處理自我賦值安全性)

我們只注意在複製pb所指東西之前別刪除 pb。**:

widget& widget::operator=(const widget& rhs)
如圖:

如果bitmap出現異常,pb以及它所指的物件都會保持原狀。

也可以自我賦值,當自我賦值的時候,如上圖,pb指向原物件的乙個副本。刪除原bitmap。返回原物件的副本。同樣實現了自我賦值。

(三)還有乙個更好的方法使我們operator=函式不僅具有」自我賦值「而且」異常安全「。這就是copy and swap 沒有new delete的困擾了

也可以const reference 為引數。還可以pass by value方式

widget& widget::operator=(widget rhs)

條款11 在operator 中處理「自我賦值」

結論1 確保當物件自我賦值時operator 有良好行為,其中技術包括比較 物件 和 目標物件 的位址 證同測試 精心周到的語句順序 以及copy and swap。例如 class bitmap class widget 證同測試 widget widget operator const widg...

條款11 在operator 中處理「自我賦值」

自行管理資源時,可能在停止使用資源之前意外釋放了它。class data class widget widget widget operator const widget rw operator 函式內的 this和rw可能是同一物件,結果就是widget物件持有乙個指標指向一塊已被刪除的data。...

條款11 在operator 中處理「自我賦值」

自我賦值 發生在物件被賦值給自己時 方式1 class widget widget w w w 方式2 a i a j 潛在的自我賦值,如果i和j有相同的值 方式3 px py 潛在的自我賦值,若px和py指向同乙個東西 class base class derived public base vo...