7

我最近偶然发现了这个 C++/Lua 错误

int function_for_lua( lua_State* L )
{
   std::string s("Trouble coming!");
   /* ... */
   return luaL_error(L,"something went wrong");
}

错误在于luaL_erroruse longjmp,因此堆栈永远不会展开,s也永远不会被破坏,导致内存泄漏。还有一些 Lua API 无法展开堆栈。

一个明显的解决方案是在 C++ 模式下编译 Lua,但有异常。然而,我不能,因为 Luabind 需要标准的 C ABI。

我目前的想法是编写自己的函数来模仿 Lua API 的麻烦部分:

// just a heads up this is valid c++.  It's called a function try/catch.
int function_for_lua( lua_State* L )
try
{
   /* code that may throw Lua_error */
}
catch( Lua_error& e )
{
   luaL_error(L,e.what());
}

所以我的问题是:function_for_lua的堆栈是否正确展开。会出什么问题吗?

4

1 回答 1

2

如果我理解正确,Luabind那么无论如何都会正确捕获和翻译引发异常的函数。(参见参考资料。)

因此,每当您需要指示错误时,只需抛出一个标准异常:

void function_for_lua( lua_State* L )
{
    std::string s("Trouble coming!");
    /* ... */

    // translated into lua error
    throw std::runtime_error("something went wrong");
}

免责声明:我从未使用过 Lubind。

于 2010-10-23T20:31:00.540 回答