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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top