Я недавно наткнулся на эту ошибку 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, которые не могут раскрутить стек.
Одним из очевидных решений является компиляция 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
Стопка раскручена. Что-то может пойти не так?