在jpeglib中,必須使用setjmp/longjmp來實現自定義錯誤處理。在setjmp被破壞之前是否創建了對象?
有很多資源,在那裏說的setjmp/longjmp的不C均扮演好++(在this question告訴他們有RAII走例子答案),但答案this question說,析構函數被調用。
我有這樣的例子(從here取出並修改了一下):
#include <iostream>
#include <csetjmp>
std::jmp_buf jump_buffer;
struct A
{
A(){std::cout<<"A()"<<std::endl;}
~A(){std::cout<<"~A()"<<std::endl;}
};
void a(int count)
{
std::cout << "a(" << count << ") called\n";
std::longjmp(jump_buffer, count+1); // setjump() will return count+1
}
int main()
{
// is this object safely destroyed?
A obj;
int count = setjmp(jump_buffer);
if (count != 9) {
a(count);
}
}
在這個例子中,調用析構函數(如我所料),但它是標準的行爲?或者它是編譯器的擴展,還是簡單的UB?
輸出:
A()
a(0) called
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called
~A()
但是在這種情況下,沒有自動對象會被異常破壞。 – john 2013-04-29 06:38:57
是的,不會拋出異常。 – 2013-04-29 06:40:28
@BЈовић,無論您的特定環境是否有效,都不會作爲UB的決定因素。有時UB的工作原理與您所期望的完全相同,但仍然是UB,並且可能在其他人的環境中(或在藍月亮期間或使用不同的編譯器選項等)完全不同。對於明確的信息,標準始終是控制文件。 – paxdiablo 2013-04-29 06:50:01