为什么在调用luaL_error时没有调用c ++对象析构函数?

时间:2014-04-28 09:09:30

标签: c++ lua lua-api

我有一段像这样的代码

class Test
{
public:
    Test() {printf(">>> Test()\n");}
    ~Test() {printf(">>> ~Test()\n");}
}

int myFunc(lua_State *L)
{
    Test t;
    luaL_error(L, "error");
    return 0;
}

我知道当lua遵守c complier时,它使用longjmp来引发错误。因此,我编译它使用c ++编译器,以便它使用c ++异常来处理错误,即使抛出错误也应该调用析构函数。但我的问题是没有调用对象的析构函数。

但是,以下代码正在运行(调用析构函数)

int myFunc(lua_State *L)
{
    Test t;
    throw(1) // just for testing
    return 0;
}

为什么会这样?我确定LUAI_THROW宏被解释为抛出关键字。

2 个答案:

答案 0 :(得分:1)

函数luaL_error()将调用exit()来取消整个程序的执行!然后不调用析构函数,因为Test t所在的范围不会结束。您应该使用其他功能才能从错误中恢复。

如何从lua调用错误?我认为您需要使用lua_cpcall进行受保护的调用,以便在错误功能上绕过此出口!

答案 1 :(得分:1)

根本原因与visual c ++编译器中的异常处理模式有关。我使用lua函数(例如luaL_error)和extern" C"修饰符,以防止编译器进行名称修改。默认的异常处理模式是/ EHsc,它假定extern" C"功能不会抛出异常。因此,无法捕获异常。解决方案是将/ EHsc更改为/ EHs。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/1deeycx5.aspx