3

すべてを処理する main_window クラスがあります。ここで重要なのは、敵のベクトルです。敵が死んだとき、エフェクト オブジェクトをエフェクトのベクトルに押し戻します。ここが便利なポイントです

lua_State *G = luaL_newstate(); // I need this thing to be global

// class constructor
Effect::Effect(int ix, int iy)
{
  // not important codes deleted
  luaL_openlibs(G);
  luaL_dofile(G, "script/effect/blue_explosion.lua");
  lua_getglobal(G, "draw_x");
  draw_x = lua_tointeger(G, -1);
  lua_getglobal(G, "draw_y");
  draw_y = lua_tointeger(G, -1);
  /* the function name */
  lua_getfield(G, LUA_GLOBALSINDEX, "setup");
  /* the first argument */
  lua_pushnumber(G, ix);
  /* the second argument */
  lua_pushnumber(G, iy);
  /* call the function with 2 arguments, return 1 result */
  lua_call(G, 2, 0);
}

これらのこと自体はうまくいっていますが、ここで問題が発生します

void Effect::close_lua()
{
    lua_close(G);
}

これは、このクロージャなしでエフェクトの有効期限が切れたときに呼び出され、Ram を使い果たし始めますが、これを使用し、ロットの Effect オブジェクトが作成された場合、物は
アクセス違反 (セグメンテーション違反)でクラッシュします。

これを修正する方法を知っている人はいますか?

または、スクリプト言語を変更する必要がありますか?

1 つの状態を 2 回閉じたようですが、lua_close(G) は同じベクトルにある別のオブジェクトにあります。

4

1 に答える 1

2

問題が解決しました!私がしたことは、lua_state オブジェクトを非公開にしたことで、もうクラッシュしなくなりました。おそらく、その lua_state ポインターが他の場所にコピーされたためです。非公開にした後は、もうコピーできません!

最初にheaderで、private セクションでlua_State *G; を宣言します。
G = luaL_newstate(); を使用します。コンストラクタで

そして、デストラクタではうまくいかないので、これをループに入れました

for(int i = effects->size()-1; i > -1 ; i--)
{
    effects->at(i).act();
    if(effects->at(i).should_remove())
    {
        effects->at(i).close_lua();
        effects->erase(effects->begin()+i);
    }
}

close_lua() ウィッチを手動で実行するのは

void Effect::close_lua()
{
    lua_close(G);
    //std::cout << "closed"; a chick line
}

タスクマネージャーでプログラムのメモリを見ていると、これらの行は完全に機能しました

于 2013-10-20T03:31:37.293 に答える