1

我有一段这样的代码

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 编译器编译时,它使用 longjmp 来引发错误。因此,我使用 c++ 编译器编译它,以便它使用 c++ 异常来处理错误,并且即使抛出错误也应该调用析构函数。但我的问题是对象的析构函数没有被调用。

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

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

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

4

2 回答 2

1

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

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

于 2014-04-28T09:19:23.567 回答
1

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

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

于 2014-05-05T06:19:23.320 回答