7 Stimmen

Stapelabwicklung in C++ bei Verwendung von Lua

Ich bin kürzlich über diesen C++/Lua-Fehler gestolpert

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

Der Fehler liegt darin, dass luaL_error verwenden. longjmp so dass der Stapel nie abgewickelt wird und s wird nie zerstört, wodurch Speicherplatz verloren geht. Es gibt noch ein paar weitere Lua-APIs, die den Stack nicht abbauen.

Eine offensichtliche Lösung ist, Lua im C++-Modus mit Ausnahmen zu kompilieren. Ich kann das jedoch nicht, da Luabind die Standard-C-ABI benötigt.

Mein derzeitiger Gedanke ist, meine eigenen Funktionen zu schreiben, die die problematischen Teile der Lua-API nachahmen:

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

Daher meine Frage: Ist function_for_lua Der Stapel wird ordnungsgemäß abgewickelt. Kann etwas schief gehen?

2voto

GManNickG Punkte 476445

Wenn ich das richtig verstehe, mit Luabind Funktionen, die Ausnahmen auslösen, werden trotzdem ordnungsgemäß abgefangen und übersetzt. (Siehe Referenz .)

Wenn Sie also einen Fehler anzeigen müssen, lösen Sie einfach eine Standardausnahme aus:

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X