C 深度解析 49 建構函式 析構函式中的異常

2021-10-03 12:29:03 字數 986 閱讀 7461

建議:不要在建構函式中丟擲異常,當建構函式中可能產生異常時,使用二階構造模式

程式設計實驗:構造中的異常

// 49-1.cpp

#include

using

namespace std;

class

test

virtual

~test()

};intmain()

catch(.

..) cout <<

"p = "

<< p << endl;

return0;

}

建構函式中丟擲異常。類指標使用 reinterpret_cast 讓其指向位址為 1 的記憶體。由於建構函式中丟擲異常,所以構造過程立即停止,當前物件無法生成,析構函式不會被呼叫,物件所占用的空間立即收回

編譯執行:

$ g++ 49-1.cpp -o 49-1

$ ./49-1

test()

exception

p = 0x1

可以看到 p 指標位址還是 1,也反應了物件沒有生成。

下面我們證明一下物件所占用的空間立即收回,使用 valgrind 進行記憶體洩漏檢測,如果記憶體被收回則不存在記憶體洩漏,由於沒有 delete,如果沒被收回則存在記憶體洩漏。

可以看到沒有出現記憶體洩漏。

如果將第 10 行的 throw 0; 注釋,就會出現記憶體洩漏,我們來檢測一下,可以看到出現了記憶體洩漏。

析構函式的異常將導致物件所使用的資源無法完全釋放。所以要避免在析構函式中丟擲異常。

1、建構函式和析構函式中不要丟擲異常

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...

建構函式和析構函式解析

1 建構函式 1.1 建構函式的執行順序 子類會自動呼叫父類的預設建構函式 如果父類中沒有預設建構函式,子類又沒有顯示宣告呼叫 如son super 1 會提示錯誤。建構函式順序如下 1 如果有基類則首先構造基類 1 呼叫順序僅僅和繼承宣告時一致,2 不管是否在子類的建構函式實現時給出顯示呼叫,例如...

C 建構函式,析構函式

一 建構函式 在建立類的物件時自動呼叫的乙個函式,主要是為物件本身做初始化工作 沒有返回值,名字和類的名字相同,因為是在建立物件時候自動呼叫的,所以必須型別為public的,可以帶引數,可以有多個 如果類中沒有建構函式,在下面三種情況下,會自動的新增預設的建構函式 1.如果類中有虛函式,或者類中有虛...