如果類中沒有寫析構函式,則系統生成乙個內聯的,不會丟擲異常的的析構函式,如下:
當b的析構函式執行完畢,還會呼叫b的成員函式的析構。比如他有個string型別的資料成員,則執行完 ~b()之後會執行~string()。在執行完成員的析構函式之後,會呼叫基類的析構函式。析構函式丟擲異常是乙個坑,例如下面的**,我們讓b類析構函式丟擲異常:class b
inline ~b()noexcept
catch (...)
}};
對於析構函式,如果我們不指出來析構函式的宣告型別,則析構函式預設的是 noexcept型別的。class a
};class b :public a
};void test()
catch (...)
}int main()
因此析構函式丟擲異常會導致程式崩潰。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 建構函式可以丟擲異常 無論何時,從建構函式中丟擲異常都是可以的。動態建立物件要進行兩個操作 分配記憶體和呼叫建構函式。若在分配記憶體時...