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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top