質問

私は最近、このC ++ / Luaのエラーこのにつまずいた。

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

エラーはそのluaL_error利用longjmpなので、スタックが巻き戻さとs決して破壊されることはありません、メモリをリークします。スタックの巻き戻しに失敗し、さらにいくつかのLuaのAPIがあります。

1つの明白な解決策は、例外を除いてC ++モードでのLuaをコンパイルすることです。私は、しかし、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のスタックが適切に解放されます。ことができる何かを行く間違った?

役に立ちましたか?

解決

私が投げる例外を正しくキャッチし、とにかく翻訳されていることを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を使用したことがありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top