【发布时间】:2013-03-28 16:30:25
【问题描述】:
我正在为 C++ 库编写一个 PERL XS 接口。当库抛出异常时,我需要调用croak。
直接在异常处理程序中执行此操作会错过对已捕获异常的析构函数的调用,正如 longjmp 调用所期望的那样。这很重要,因为异常包含不会被释放的字符串成员。
显而易见的解决方案是在 catch 块之后执行croak,如果捕获到异常,如下所示:
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);
}
【问题讨论】: