jpeglibでは、 setjmp/longjmp を使用してカスタム エラー処理を実装する必要があります。
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);
}
}
この例では、(予想どおり) デストラクタが呼び出されますが、それは標準的な動作ですか? それとも、コンパイラの拡張機能ですか、それとも単純な 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()