В 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
Да, исключение не выбрасывается. –
@ BЈовић, независимо от того, работает ли ваша конкретная среда или нет, это _never_ решение для UB. Иногда UB работает точно так, как вы ожидали, но он все еще UB, и может работать совершенно по-другому в чужой среде (или во время синей луны, или с разными параметрами компилятора и т. Д.). Для окончательной информации стандарт всегда является контрольным документом. – paxdiablo