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_luaA pilha é apropriada. Algo pode dar errado?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top