我正在为 C++ 库编写一个 PERL XS 接口。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);
}