Stack rilassarsi in C ++ quando si utilizza Lua
-
25-09-2019 - |
Domanda
Recentemente ho inciampato in questo questo ++ / C Errore Lua
int function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
return luaL_error(L,"something went wrong");
}
L'errore è che l'uso luaL_error
longjmp
, quindi la pila è mai svolto e s
viene mai distrutto, perde la memoria. Ci sono un paio di Lua API che non riescono a svolgere la pila.
Una soluzione ovvia è di compilare Lua in modalità C ++ con le eccezioni. Io, invece, non può come Luabind ha bisogno della C ABI standard.
Il mio pensiero attuale è quella di scrivere le mie funzioni che imitano le parti fastidiosi delle 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());
}
Quindi la mia domanda è: lo stack di function_for_lua
correttamente svolto. Can qualcosa di sbagliato?
Soluzione
Se ho capito bene, con funzioni Luabind
che generano eccezioni siano catturati e tradotti in ogni caso. (Vedere riferimento .)
Così ogni volta che è necessario indicare un errore, solo un'eccezione di serie:
void function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
// translated into lua error
throw std::runtime_error("something went wrong");
}
Disclaimer: io ho mai usato Lubind.