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

2021-09-12 09:58:19 字數 633 閱讀 1662

自行管理資源時,可能在停止使用資源之前意外釋放了它。

class data;

class widget;

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

operator=函式內的*this和rw可能是同一物件,結果就是widget物件持有乙個指標指向一塊已被刪除的data。

新增證同測試:

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

如果"new data"導致異常(記憶體不足或copy構造丟擲異常),結果和上面一樣。

一般情況下,讓operator=具備「異常安全性」往往自動獲得「自我賦值安全性」

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

delete 延後,如果"new data"導致異常,pb將保持原狀。

在operator=函式內手工排列語句的乙個好的替代方案是使用,copy and swap技術,條款29。

確定任何函式如果操作乙個以上的物件,而其中多個物件是同乙個物件時,其行為仍然正確。

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

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

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

一 有別名的存在,所以有可能自我賦值。下面的 不具備自我賦值的安全性 也不具備 異常安全性 class bitmap class widget widget widget operator const widget rhs 自我賦值的話,呼叫的物件和傳入的引數是同乙個物件,this 跟rhs是同乙個...

條款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...