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?