c 建構函式和析構函式丟擲異常的注意事項

2022-06-08 17:33:08 字數 703 閱讀 6401

從語法上來說,建構函式和析構函式都可以丟擲異常。但從邏輯上和風險控制上,建構函式和析構函式中盡量不要丟擲異常,萬不得已,一定要注意防止資源洩露。在析構函式中丟擲異常還要注意棧展開帶來的程式崩潰。

1.建構函式中丟擲異常

在c++建構函式中,既需要分配記憶體,又需要丟擲異常時要特別注意防止記憶體洩露的情況發生。因為在建構函式中丟擲異常,在概念上將被視為該物件沒有被成功構造,因此當前物件的析構函式就不會被呼叫。同時,由於建構函式本身也是乙個函式,在函式體內丟擲異常將導致當前函式執行的結束,並釋放已經構造的成員物件,當然包括其基類的成員,即要執行直接基類和成員物件的析構函式。考察如下程式。

#include using namespace std;

class c

catch(…)

}

在面對析構函式中丟擲異常時,程式猿要注意以下幾點:

(1)c++中析構函式的執行不應該丟擲異常;

(2)假如析構函式中丟擲了異常,那麼你的系統將變得非常危險,也許很長時間什麼錯誤也不會發生;但也許你的系統有時就會莫名奇妙地崩潰而退出了,而且什麼跡象也沒有,不利於系統的錯誤排查;

(3)當在某乙個析構函式中會有一些可能(哪怕是一點點可能)發生異常時,那麼就必須要把這種可能發生的異常完全封裝在析構函式內部,決不能讓它丟擲函式之外。

一定要切記上面這幾條總結,析構函式中丟擲異常導致程式不明原因的崩潰是許多系統的致命內傷!

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

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

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

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

c語言中建構函式和析構函式丟擲異常

c 中建構函式和析構函式可以丟擲異常嗎?答案是c 1.不建議在建構函式中丟擲異常 2.建構函式丟擲異常時,析構函式將不會被執行,需要手動的去釋放記憶體 1.析構函式不應該丟擲異常 2.當析構函式中會有一些可能發生異常時,那麼就必須要把這種可能發生的異常完全封裝在析構函式內部,決不能讓它丟擲函式之外 ...