在jpeglib中,必须使用setjmp/longjmp来实现自定义错误处理。
有很多资源声称setjmp/longjmp与C++不兼容(例如此问题中的答案表明它们无法与RAII一起使用),但此问题的答案表明析构函数会被调用。
我有一个示例(从这里获取并进行了修改):
在这个例子中,析构函数被调用了(正如我所预期的那样),但这是标准行为吗?还是编译器的扩展,或者只是未定义行为?
输出结果:
有很多资源声称setjmp/longjmp与C++不兼容(例如此问题中的答案表明它们无法与RAII一起使用),但此问题的答案表明析构函数会被调用。
我有一个示例(从这里获取并进行了修改):
#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);
}
}
在这个例子中,析构函数被调用了(正如我所预期的那样),但这是标准行为吗?还是编译器的扩展,或者只是未定义行为?
输出结果:
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()
longjmp
位置放置一个throw
,并在当前的setjmp
位置放置一个catch
,则不会调用任何析构函数。只有在您在setjmp
和longjmp
之间的某个地方创建了obj
时才会出现问题。 - paxdiablomain
结束时将被销毁。这在处理本地/块范围的“正常”标准部分中有所涵盖(C++03的3.3.2,C++11的3.3.3)。 - paxdiablo