Stack déroulant en C ++ lors de l'utilisation Lua
-
25-09-2019 - |
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?
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.