c++並不禁止析構函式吐出異常,但是它不鼓勵這樣做
class widget;};
vector
vec;
當vec被銷毀時,他有責任銷毀其內含的所有widget
如果vec內含10個widget,在析構第乙個元素期間,有個異常被丟擲,其他9個widget還是應該被銷毀,否則他們儲存的資源都會發生洩漏
當碰到析構函式需要丟擲異常時的解決方法:
(關於資料庫操作的類)
class dbcon
catch
};private:
dbconnection db;
};
class dbcon
catch
};private:
dbconnection db;
};
更好的解決方法是重新設計介面
class dbcon
~dbcon()
catch}};
private:
dbconnection db;
bool closed;
};
effective c 關於異常安全
假設有個class用來表現夾帶背景圖案的 gui選單,用於多執行緒,有個互斥器作為併發控制 class prettymenu void prettymenu changebackground std istream imgsrc 帶有異常安全性的函式會 1 不洩露任何資源 一旦 new image ...
別讓異常逃離析構函式
c 中並不禁止析構函式吐出異常,但是並鼓勵這樣做,看下面 當vector v被銷毀時,它有責任將其中所有的widgets銷毀並且 記憶體,而在析構第乙個元素時候,析構函式會丟擲異常,但是第二個vector的時候也會丟擲異常,這對於c 來說太多了。這會導致程式不明確的行為。c 不喜歡析構函式吐出異常。...
effect C 別讓異常逃離析構函式
class widget void dosomething 當vector v被銷毀,它有責任銷毀內含的所有widgets。假設v內含十個widgets,而在析構第乙個元素期間,有個異常被丟擲。其他九個widgets還是應該被銷毀 否則它們儲存的任何資源都會發生洩露 因為v應該呼叫它們它們各個析構函...