Разматывание стека в C ++ при использовании Lua - PullRequest
7 голосов
/ 24 октября 2010

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

1 Ответ

2 голосов
/ 24 октября 2010

Если я правильно понимаю, с помощью Luabind функции, которые генерируют исключения, правильно все равно перехватываются и переводятся.(См. ссылка .)

Поэтому, когда вам нужно указать на ошибку, просто скажите стандартное исключение:

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

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

Отказ от ответственности: я никогда неиспользовал любинд.

...