考慮以下代碼:
#include <iostream>
class Widget {
public:
~Widget() {
std::cout << "Destructor Called!";
}
};
void doStuff() {
Widget w;
throw 1;
}
int main() {
doStuff();
}
因為 main 中沒有捕獲例外,所以編譯器可以throw安排程式在with ~Widgetnot called之后立即呼叫 terminate 。
由于標準沒有指定是否呼叫解構式,這是未定義的行為嗎?
注意:該示例來自Fedor Pikus 的 CppCon 2015 演講。
編輯: 這個問題詢問編譯器對解構式省略的自由度,但是它處于特殊的不同情況。該問題的答案不適用于該問題。
uj5u.com熱心網友回復:
沒有捕捉到例外未定義的行為嗎?
不,這是明確定義的,這將導致呼叫std::terminate(沒有 UB),盡管堆疊是否在呼叫是實作定義之前展開,根據[except.terminate]:
/1 在某些情況下,例外處理被放棄用于不太微妙的錯誤處理技術。
- [...]
- 當例外處理機制找不到拋出例外的處理程式時([except.handle]),或
/2 在這種情況下,
std?::?terminate呼叫該函式。在沒有找到匹配處理程式的情況下,在呼叫之前堆疊是否展開是實作定義的std?::?terminate。[...] 基于展開程序最終將導致呼叫函式的確定,不允許實作過早完成堆疊展開std?::?terminate
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/489145.html
