copy & swap 是 exception handle 常用的技巧。處理資料的過程中,難免會遇到異常狀況,好的異常處理非 commit 則 rollback。前者保證「付諸行動」,也就是必完成使用者的要求;後者保證發生異常時,資料維持不變。copy & swap 用來實行後者,先處理副本,再與欲處理的資料交換。這樣一來,若處理過程中發生錯誤,原資料仍完好如一。
假設有個 class factory
,其中有個 function process
:
class factory {
public:
/* constructor, destructor, and other function */
void process (factory &);
private:
/* some data members */
}
void factory::process (factory &obj) {
// process directly obj
}
process
直接對 obj
處理,若很不幸地發生異常,process
被迫停止,將留處理不完全的 obj
。
另一個 process
版本:
void factory::process (factory &obj) {
factory temp (obj);
// process the copy : temp
swap (obj, temp);
}
我們先拷貝 obj
,之後對其副本做運算,處理完成後,再交換處理過的副本與原先資料。若異常發生,temp
的 destructor 將釋放 temp
佔用的記憶體,而 obj
保持不變,也就是rollback。
--
exceptional C++ 的寶藏真多:p