Pila de relajarse en C ++ utilizando las Lua
-
25-09-2019 - |
Pregunta
I recientemente tropezó en este esta ++ / error C Lua
int function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
return luaL_error(L,"something went wrong");
}
El error es que el uso luaL_error
longjmp
, por lo que la pila no es desenrollada y s
no se destruye, fugas de memoria. Hay un poco más de la API Lua que no logran descansar la pila.
Una solución obvia es compilar Lua en el modo C ++ con excepciones. I, sin embargo, no como las necesidades Luabind el estándar C ABI.
Mi pensamiento actual es escribir mis propias funciones que imitan las partes problemáticas de la 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());
}
Así que mi pregunta: ¿Es la pila de function_for_lua
adecuadamente desenrollado. Can algo sale mal?
Solución
Si he entendido bien, con funciones Luabind
que las excepciones de tiro están correctamente capturados y traducidos de todos modos. (Ver referencia .)
Así que cada vez que necesita para indicar un error, simplemente lanzar una excepción estándar:
void function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
// translated into lua error
throw std::runtime_error("something went wrong");
}
Exención de responsabilidad: Nunca he usado Lubind.