我正在编写一个将PERL XS接口与C++库相结合的程序。当库抛出异常时,我需要调用
直接在异常处理程序中执行此操作会导致无法调用已捕获异常的析构函数,这是
显而易见的解决方案是在catch块之后执行
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);
}
e
,尽管这种行为是未定义的,那么你可能是对的;但在我看来,依赖未定义的行为是一个非常糟糕的想法。 - Mike Seymour