Раскрутка стека в C ++ при использовании Lua

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

7
задан GManNickG 23 October 2010 в 20:21
поделиться