C 類(三) 不要在析構函式中丟擲異常

2021-09-10 17:43:52 字數 1625 閱讀 8386

如果類中沒有寫析構函式,則系統生成乙個內聯的不會丟擲異常的的析構函式,如下:

class b 

inline ~b()noexcept

catch (...)

}};

當b的析構函式執行完畢,還會呼叫b的成員函式的析構。比如他有個string型別的資料成員,則執行完 ~b()之後會執行~string()。在執行完成員的析構函式之後,會呼叫基類的析構函式。析構函式丟擲異常是乙個坑,例如下面的**,我們讓b類析構函式丟擲異常:

class a 

};class b :public a

};void test()

catch (...)

}int main()

對於析構函式,如果我們不指出來析構函式的宣告型別,則析構函式預設的是 noexcept型別的

class b :public a 

};

因此析構函式丟擲異常會導致程式崩潰

如果你就是想讓析構函式丟擲異常,可以這樣設定嗎?

~b() noexcept(false)
執行一下修改後的**,似乎沒有問題

答案是——不可以!!!!!假如b類中也丟擲乙個異常

執行一次try,c和b兩個類都丟擲了異常,c++在一次try時只能處理乙個異常

如果小槓精說:我保證寫的基類和派生類中只有乙個異常,總可以了吧?答案依然是——不可以

class a 

};class b :public a

};class c :public b

};void test()

catch (...)

}

還是因為只能處理乙個異常。

這就是為什麼析構函式預設是noexcept的原因

析構函式中丟擲的異常

析構函式在什麼時候被呼叫執行?對於c 程式設計師來說,這個問題比較簡單,但是比較愛嘮叨的阿愚還是建議應該在此再提一提,也算回顧一下c 的知識,而且這將對後面的討論和理解由一定幫助。先看乙個簡單的示例吧!如下 class mytest base void main catch 編譯執行上面的程式,從程...

建構函式和析構函式中丟擲異常

不會造成記憶體洩漏 1 new乙個物件有兩個過程 a.向系統申請記憶體空間 b.在申請的記憶體空間上執行建構函式,初始化物件。2 內部物件構造先於物件本身。3 物件在建構函式丟擲異常後,系統會負責清理構造物件時申請的記憶體,但不會呼叫物件析構函式。也就是說構造物件的記憶體會被釋放掉,已經完成例項化的...

C 建構函式 析構函式與丟擲異常

問題 建構函式可以丟擲異常麼?析構函式可以嗎?分析 從語法上來說,建構函式和析構函式都可以丟擲異常。但從邏輯上和風險控制上,建構函式可以,析構函式不推薦丟擲異常。1 建構函式可以丟擲異常 無論何時,從建構函式中丟擲異常都是可以的。動態建立物件要進行兩個操作 分配記憶體和呼叫建構函式。若在分配記憶體時...