Я недавно наткнулся на эту ошибку 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
никогда не разрушается, происходит утечка памяти,Есть еще несколько API-интерфейсов Lua, которым не удается развернуть стек.
Одним из очевидных решений является компиляция Lua в режиме C ++ с исключениями.Однако я не могу, так как 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
правильно размотан.Может ли что-то пойти не так?