Question

Je suis tombé récemment dans ce ce C ++ / erreur Lua

int function_for_lua( lua_State* L )
{
   std::string s("Trouble coming!");
   /* ... */
   return luaL_error(L,"something went wrong");
}

L'erreur est que l'utilisation de luaL_error longjmp, de sorte que la pile est jamais déroulé et s ne soit jamais détruite, la mémoire fuit. Il y a quelques API Lua de qui ne parviennent pas à dérouler la pile.

Une solution évidente est de compiler Lua en mode C ++ avec des exceptions. Cependant, je ne peux pas en fonction des besoins Luabind la norme C ABI.

Ma pensée actuelle est d'écrire mes propres fonctions qui imitent les parties gênants de l'API 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());
}

Ma question: Est-ce que la pile de function_for_lua correctement déroulé. quelque chose peut mal tourner?

Était-ce utile?

La solution

Si je comprends bien, avec des fonctions de Luabind qui jettent des exceptions sont correctement capturés et traduits de toute façon. (Voir de référence.)

Donc, chaque fois que vous devez indiquer une erreur, il suffit de jeter une exception standard:

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

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

Disclaimer: Je ne l'ai jamais utilisé Lubind.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top