Stack Abwickeln in C ++ als Lua Verwendung
-
25-09-2019 - |
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?
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.