Стог разматывает в C ++ при использовании LUA
-
25-09-2019 - |
Вопрос
Я недавно наткнулся на эту ошибку 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
стек правильно раскручивается. Может что-то пойти не так?
Решение
Если я правильно понимаю, с Luabind
Функции, которые бросают исключения, правильно пойманы и переведены в любом случае. (Видеть ссылка.)
Поэтому, когда вам нужно указать ошибку, просто выбросьте стандартное исключение:
void function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
// translated into lua error
throw std::runtime_error("something went wrong");
}
Отказ от ответственности: Я никогда не использовал люснул.