1

私はこのようなコードを持っています

class Test
{
public:
    Test() {printf(">>> Test()\n");}
    ~Test() {printf(">>> ~Test()\n");}
}

int myFunc(lua_State *L)
{
    Test t;
    luaL_error(L, "error");
    return 0;
}

lua が c コンパイラーによってコンパイルされたとき、longjmp を使用してエラーが発生することを私は知っています。そのため、C++ コンパイラを使用してコンパイルし、C++ 例外を使用してエラーを処理し、エラーがスローされた場合でもデストラクタを呼び出すようにしました。しかし、私の問題は、オブジェクトのデストラクタが呼び出されないことです。

ただし、次のコードは機能しています (デストラクタが呼び出されます)。

int myFunc(lua_State *L)
{
    Test t;
    throw(1) // just for testing
    return 0;
}

なぜこれが起こったのですか?LUAI_THROW マクロはスロー キーワードとして解釈されるはずです。

4

2 に答える 2

1

根本的な原因は、Visual C++ コンパイラの例外処理モードに関連しています。コンパイラの名前マングリングを防ぐために、lua 関数 (luaL_error など) を extern "C" 修飾子と共に使用します。また、デフォルトの例外処理モードは /EHsc であり、extern "C" 関数が例外をスローしないことを前提としています。したがって、例外をキャッチできません。解決策は、/EHsc を /EHs に変更することです。

詳細については、http://msdn.microsoft.com/en-us/library/1deeycx5.aspxを参照してください。

于 2014-05-05T06:19:23.320 に答える