Stack se desenrolando em C ++ ao usar Lua
-
25-09-2019 - |
Pergunta
Recentemente, tropecei neste erro C ++/Lua
int function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
return luaL_error(L,"something went wrong");
}
O erro é que luaL_error
usar longjmp
, então a pilha nunca é desalinhada e s
nunca é destruído, vazando memória. Existem mais algumas APIs do Lua que não conseguem relaxar a pilha.
Uma solução óbvia é compilar Lua no modo C ++ com exceções. No entanto, não posso, como Luabind precisa do C ABI padrão.
Meu pensamento atual é escrever minhas próprias funções que imitam as partes problemáticas da API da Lua:
// 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());
}
Então minha pergunta: é function_for_lua
A pilha é apropriada. Algo pode dar errado?
Solução
Se eu entendi corretamente, com Luabind
As funções que lançam exceções são adequadamente capturadas e traduzidas de qualquer maneira. (Ver referência.)
Portanto, sempre que você precisar indicar um erro, basta jogar uma exceção padrão:
void function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
// translated into lua error
throw std::runtime_error("something went wrong");
}
Isenção de responsabilidade: Eu nunca usei Lubind.