Frage

Ich stolperte vor kurzem in diese dieses C ++ / Lua Fehler

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

Der Fehler ist, dass luaL_error Verwendung longjmp, so dass der Stapel nie abgewickelt und s wird nie zerstört, Speicher undicht. Es gibt noch ein paar Lua-API, die den Stapel entspannen fehlschlagen.

Eine offensichtliche Lösung ist Lua in C ++ Modus mit Ausnahmen zu kompilieren. Ich kann aber nicht als Luabind benötigt das Standard-C-ABI.

Mein aktueller Gedanke ist meine eigenen Funktionen, dass imitieren die störenden Teile des Lua-API schreiben:

// 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());
}

Also meine Frage: Ist Stack des function_for_lua richtig abgerollt. Kann etwas schief gehen?

War es hilfreich?

Lösung

Wenn ich richtig verstehe, mit Luabind Funktionen dass throw Ausnahmen sind sowieso richtig gefangen und übersetzt. (Siehe Referenz .)

Also, wenn Sie einen Fehler anzeigen müssen, nur eine Standard-Ausnahme auslösen:

void function_for_lua( lua_State* L )
{
    std::string s("Trouble coming!");
    /* ... */

    // translated into lua error
    throw std::runtime_error("something went wrong");
}

Haftungsausschluss: Ich habe Lubind nie benutzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top