5

私はCAPIを備えたLuaを使用しており、そのエラー発生関数はlongjmpsを使用しています。エラーを発生させるとき、私は最初に何がうまくいかなかったかを説明するメッセージを作成し、次にLuaにエラーを発生させるように指示します。例えば

std::stringstream ss;
ss << "'" << function->cb->name << "' expects at most " << maxargs_all  
<< " argument(s) and received " << nargs;
luaL_error(L, ss.str().c_str());

longjmpはスタックを巻き戻さないので、stringstreamオブジェクトが破壊されないことを理解しています。私の記憶が正しければstringstream、他のC ++ライブラリクラスは通常、ヒープにデータを割り当てます。このデータは、オブジェクトが破棄されると解放されます。ただし、ここではデストラクタが呼び出されないため、メモリリークが発生すると思います。スクリプトを書いた人によっては、多くのエラーが発生し、多くのメモリがリークする可能性があります。

他の人もこれと同じような問題を解決する必要があると思いますが、私が求めているものは何も見つかりません。多くの場所でオブジェクトは破壊されないと言われていますが、メモリが解放されるようにする方法が必要だと思いますか?

4

1 に答える 1

8

解決策は、LuaをC++ライブラリとしてコンパイルすることです。次にluaL_error()、呼び出す代わりに例外をスローし、longjmp()スタックの巻き戻しによってすべてが破棄されます。

于 2012-11-26T08:19:23.317 に答える