Явный вызов деструктора перед longjmp / croak

Я пишу интерфейс PERL XS для библиотеки C ++. Мне нужно позвонить croak когда библиотека выдает исключение.

Выполнение этого непосредственно в обработчике исключений пропускает вызов деструктора пойманного исключения, как и ожидалось longjmp вызов. Это важно, потому что исключение содержит строковые члены, которые не будут освобождены.

Очевидное решение состоит в том, чтобы сделать croak после блока catch, если исключение было перехвачено, например:

bool do_croak = false;
try {
throw MyException();
} catch (MyException &e) {
do_croak = true;
}
if (do_croak)
croak(NULL);

Но мне интересно: достаточно ли будет просто явно вызвать деструктор пойманного исключения непосредственно перед longjmp? Как это:

try {
throw MyException();
} catch (MyException &e) {
e.~MyException();
croak(NULL);
}

3

Решение

Практически невозможно использовать longjmp безопасно в программе на C ++. В частности:

С ++ 11 18.10 / 4: A setjmp/longjmp Пара вызовов имеет неопределенное поведение при замене setjmp а также longjmp от catch а также throw будет вызывать любые нетривиальные деструкторы для любых автоматических объектов.

В этом случае выдается исключение из croak будет вызывать деструктор eтак зовет longjmp оттуда даст неопределенное поведение. Вызов деструктора сам делает поведение еще менее определенным.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]