7

最近、この C++/Lua エラーに出くわしました

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

エラーはluaL_erroruselongjmpであるため、スタックが巻き戻されたり、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のスタックは適切に巻き戻されていますか? 何か問題が発生する可能性はありますか?

4

1 に答える 1

2

私が正しく理解していれば、Luabind例外をスローする関数は適切にキャッチされ、とにかく変換​​されます。(参照を参照してください。)

したがって、エラーを示す必要があるときはいつでも、標準の例外をスローするだけです:

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

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

免責事項: Lubind を使用したことはありません。

于 2010-10-23T20:31:00.540 に答える