使用Lua时在C ++中进行堆栈展开

时间:2010-10-23 20:14:36

标签: c++ lua destructor stack-unwinding

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

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

错误是luaL_error使用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的堆栈是否正确解开。可能出现问题吗?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,那么抛出异常的Luabind函数无论如何都会被正确捕获和翻译。 (见reference。)

因此,无论何时需要指出错误,只需抛出一个标准异常:

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

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

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