我有以下lua_CFunction,用C ++编写:
int my_function(lua_State* L) {
int x = 0;
try {
x = do_cpp_stuff_that_invokes_lua_API_as_well();
} catch(const std::exception& ex) {
lua_pushstring(ex.what().c_str());
lua_error(L);
}
return x;
}
我的问题如下:是否可以执行lua_error(L)或调用任何可能是longjmp的lua函数:
我只是通过不分配任何依赖于析构函数的东西(字符串等等)来处理堆栈上分配的变量。如果我需要这样做,那么该范围内的所有lua函数都包含在pcall中,如果该pcall失败,则会向我发布的此函数抛出异常。 我只关心try-catch块。
非常感谢
答案 0 :(得分:3)
相关规则是(§18.10[support.runtime] / p4):
函数签名
longjmp(jmp_buf jbuf, int val)
有更多 本国际标准中的限制行为。一个setjmp/longjmp
如果替换setjmp
和,则调用对具有未定义的行为longjmp
和catch
throw
会调用任何非平凡的内容 任何自动对象的析构函数。
C ++标准不会限制使用setjmp
和longjmp
。
答案 1 :(得分:1)
如果从catch块进行长跳转,则至少会泄漏用于存储异常对象的内存。编译器生成代码,从而在catch块范围之外的控制流路径上释放此内存。如果你进行长跳,则不会采用这些路径。
Sun Studio's documentation禁止明确地混合异常和longjmp:
特别是,你不能长时间进入或退出try-block或catch-block(直接或间接),或者longjmp超过自动变量或临时变量的初始化或非平凡的破坏。