關於堆棧展開,C++標準表示:是堆棧展開與C++標準保證的異常?
例外,被認爲是完成了異常對象的初始化後未捕獲的([except.throw]),直到完成處理程序的激活爲異常([ except.handle])。這包括堆棧展開。
在par 15.5.3的當前標準。我試圖理解最新的句子(This includes stack unwindings
)是指什麼:
- 是否它假定編譯器必須關心展開堆棧?
- 或者,它是說它是依賴於編譯器來解放還是不是堆棧?
問題源於下面的代碼片段:
#include <iostream>
#include <exception>
struct S{
S() { std::cout << " S constructor" << std::endl; }
virtual ~S() { std::cout << " S destructor" << std::endl; }
};
void f() {
try{throw(0);}
catch(...){}
}
void g() {
throw(10);
}
int main() {
S s;
f();
//g();
}
現在:
- ,如果你運行它,是(捕獲異常),你有堆棧展開的提示
- 如果您對
f();
發表評論並取消註釋g();
(沒有捕捉到該例外情況),則表示您沒有解開堆棧的提示
因此,這兩個實驗似乎贊成上面的第一個項目符號; clang ++和g ++都同意結果(但它不是判別式)。
而且,在我看來很奇怪的標準,這是在指定和時間在這裏留下了陰影對象現場時非常小心。
有人可以澄清嗎?對於標準保證的未捕獲異常,堆棧展開?如果是,在哪裏?如果不是,爲什麼?
在發佈的程序中,'s'在堆棧展開期間不會被破壞。它在'f()'返回後被銷燬。 – aschepler