建構函式裡丟擲異常 c 可否同時丟擲兩個異常

2021-10-14 23:54:03 字數 1542 閱讀 6141

c++ 可否同時丟擲兩個異常​wcy123.github.io在 c++ 中,如果我們丟擲異常後 ,在捕獲異常之前,會析構掉所有還在堆疊上的物件。

#include using namespace std;

class object ;

object::~object()

void foo() catch(const exception & e)

}int main(int argc, char *ar**)

這個時候,程式的輸出是

deconstructor is invoked.

catch exception: only for testing

這裡只有一層函式呼叫,如果有多層函式呼叫,也是類似的。

#include using namespace std;

class object ;

~object();

int value_;

};object::~object()

void foo3()

void foo2()

void foo1()

int main(int argc, char *ar**)

catch(const exception & e)

return 0;

}

程式輸出結果是

deconstructor is invoked. value=2

deconstructor is invoked. value=1

catch exception: only for testing

可以看到,堆疊上的所有物件都被析構掉了。呼叫析構函式的順序和呼叫建構函式的順序相反。也就是說,堆疊上的物件按照被構造的順序,反序析構。

什麼叫做「同時丟擲兩個異常」 ? 在上面的例子中,如果我們在析構函式中再丟擲乙個異常,這樣在捕獲異常之前,就會同時存在兩個異常。

#include using namespace std;

class object ;

object::~object()

void foo() catch(const exception & e)

}int main(int argc, char *ar**)

在 c++ 中,如果像這樣同時存在兩個異常,那麼程式會呼叫std::terminate,程式異常退出。

上面的例子中,輸出結果是

deconstructor is invoked.

libc++abi.dylib: terminating with uncaught exception of type std::invalid_argument: another exception

於是,不要在析構函式裡面丟擲異常

php建構函式裡丟擲異常 建構函式失敗 丟擲異常

網上比較經典的總結 什麼函式都有可能失敗,建構函式也不另外,比如new乙個物件或空間不成功。當建構函式失敗的時候,其實很多時候我們不想這個物件被繼續生成,這個時候就可以在建構函式裡面丟擲異常。c 規定建構函式丟擲異常之後,物件將不被建立,析構函式也不會被執行,但已經建立成功的部分 比如乙個類成員變數...

建構函式中拋異常

1 建構函式中是否可以拋異常?可以。2 有什麼限制嗎?有限制。構造拋異常之前必須把已經申請的資源釋放掉。這樣,就算你的物件是new出來的,也不會造成記憶體洩漏。因為析構函式不會被呼叫,所以丟擲異常後,你沒機會釋放資源。建議,在建構函式中不要做過多的事情,只是能對成員變數的做初始化工作就好了。真的需要...

建構函式中拋異常

1 建構函式中是否可以拋異常?可以。2 有什麼限制嗎?有限制。構造拋異常之前必須把已經申請的資源釋放掉。這樣,就算你的物件是new出來的,也不會造成記憶體洩漏。因為析構函式不會被呼叫,所以丟擲異常後,你沒機會釋放資源。建議,在建構函式中不要做過多的事情,只是能對成員變數的做初始化工作就好了。真的需要...