星期二, 9月 26, 2006

copy & swap

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

沒有留言: