2010-10-23 3 views
6

J'ai récemment trébuché dans ce ce C++/erreur LuaStack déroulant en C++ lors de l'utilisation Lua

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

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

Une solution évidente est de compiler Lua en mode C++ avec des exceptions. Moi, cependant, je ne peux pas, car Luabind a besoin du standard 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-pile de function_for_lua correctement déroulé. Quelque chose peut-il aller mal?

+0

Je suis confus lorsque vous avez mentionné Luabind. Luabind lui-même est une bibliothèque C++, mais il semble que vous ne l'utilisiez pas de toute façon? – dvide

Répondre

2

Si je comprends bien, avec Luabind les fonctions qui jettent des exceptions sont correctement attrapées et traduites de toute façon. (Voir reference.)

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.

+0

n'est-ce pas 'std :: runtime_error' :)? –

+0

@Armen: Il faut garder les gens sur leurs gardes. – GManNickG