天天看點

Effective C++學習筆記 (11)在operator=中處理“自我指派”

本人學習C++不精,故重新學習,點滴記錄與大家分享,不足之處還望大牛多多指教

Effective C++學習筆記 (11)在operator=中處理“自我指派”

在operator=中處理“自我指派”

         該條款首先提出了有可能出現自我指派的情況,同時提出了幾種可能存在的潛在自我指派,然後通過解釋了自我指派可能出現的問題,以及如何解決“自我指派”以及“異常安全性”這兩類問題。

         首先看一下以下的代碼

Effective C++學習筆記 (11)在operator=中處理“自我指派”

這樣運用指派運算符沒任何問題,在指派運算符中先釋放自己的m_np,然後在構造一份和item一樣的,但是如果改成自我指派呢?

Effective C++學習筆記 (11)在operator=中處理“自我指派”

很容易看出來先把自己的m_np釋放了,然後又去取值,導緻通路一個非法記憶體,是以自我指派需要小心。是以該條款提醒我們在實作複制運算符時需要考慮到自我指派的情況,對其特殊處理。

Effective C++學習筆記 (11)在operator=中處理“自我指派”

很簡單的判斷,但是仔細考慮下如果在new的時候出現異常,怎麼辦?比如new失敗,那樣一來該對象内部就存在一個非法指針,這是不允許的。是以考慮修改下代碼實作順序,可以有所改進。

Effective C++學習筆記 (11)在operator=中處理“自我指派”

大家可能發現這個代碼實作的确實不夠優美,effectiveC++提供了一種copy and swap技術,先構造一個對象,然後再将該對象與this互換,但是我覺得在swap的時候也有可能出現一些問題,當然這些問題在條款12裡有所講述。Copy and swap代碼不多,這裡就不再寫了。總之在寫指派運算符時需要多想想一些特殊的情況。確定該函數對任何一個對象它的結果都沒問題。