最近、この C++/Lua エラーに出くわしました
int function_for_lua( lua_State* L )
{
std::string s("Trouble coming!");
/* ... */
return luaL_error(L,"something went wrong");
}
エラーはluaL_error
uselongjmp
であるため、スタックが巻き戻されたり、s
破壊されたりして、メモリ リークが発生することはありません。スタックの巻き戻しに失敗する Lua API が他にもいくつかあります。
明らかな解決策の 1 つは、Lua を C++ モードで例外を使用してコンパイルすることです。ただし、Luabind には標準の C ABI が必要なため、できません。
私の現在の考えは、Lua API の厄介な部分を模倣する独自の関数を作成することです。
// 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());
}
だから私の質問:function_for_lua
のスタックは適切に巻き戻されていますか? 何か問題が発生する可能性はありますか?