2010-10-23 6 views
6

Recientemente me encontré en esta presente en C++/Lua errorPila de relajarse en C++ al utilizar Lua

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

El error es que luaL_error uso longjmp, por lo que la pila no se desenrolla y se s no se destruye, fugas de memoria. Hay algunas API de Lua más que no pueden desenrollar la pila.

Una solución obvia es compilar Lua en modo C++ con excepciones. Yo, sin embargo, no puedo, ya que Luabind necesita el C ABI estándar.

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 function_for_lua 's pila adecuadamente desenrollado. ¿Puede pasar algo?

+0

Estoy confundido cuando mencionas Luabind. Luabind en sí es una biblioteca de C++, pero parece que no la está usando de todos modos. – dvide

Respuesta

2

Si entiendo correctamente, con Luabind las funciones que arrojan excepciones se capturan y se traducen correctamente de todos modos. (Ver reference.)

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"); 
} 

responsabilidad: Nunca he usado Lubind.

+0

¿no es 'std :: runtime_error' :)? –

+0

@Armen: Tengo que mantener a la gente alerta. – GManNickG