c++ - 当 C 中的对象 vector 中有太多 lua_state 时,lua_close() 崩溃

标签 c++ lua segmentation-fault

所以有一个 main_window 类来处理所有事情,这里重要的是敌人的 Vector,敌人,当敌人死亡时,它会将一个效果对象推回到 Effect 的 vector 中。这是方便的地方

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 但如果我使用它,并且创建了 Lot 的 Effect 对象,它就会崩溃并显示
访问冲突(段错误)

有人知道如何解决这个问题吗?

或者我应该只更改一种脚本语言?

好像我关闭了一个状态两次,但是 lua_close(G) 在同一个 vector 中的不同对象中,我只是想出一个办法,也许我也可以把 lua_states 放在一个 vector 中?

最佳答案

问题解决了!我所做的是将 lua_state 对象设为private 并且它不再崩溃,这可能是因为 lua_state 指针被复制到其他地方,所以现在在我将它设为私有(private)之后它就不是copyable 了!

所以首先在header,private section声明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
}

当我在任务管理器中查看程序的内存时,这些行工作得很好

关于c++ - 当 C 中的对象 vector 中有太多 lua_state 时,lua_close() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19461980/

相关文章:

c++ - 使用 makefile 在最终可执行文件之前创建库

c++ - 基于 SDL2 的游戏和 GADBannerView

lua - 对于循环不完全正确的 Lua

c++ - 使用 GstDiscoverer (GStreamer) 的段错误

c++ - 在 C++ 中是否可以使用带有和不带有编译时间常量的相同代码?

c++ - 从wxWidgets中的.DLL加载图标

c++ - 可以在 Lua 中加载 C++ dll 文件吗?

linux - 如何在同一个linux系统上拥有不同的lua版本

c - printf() 函数导致段错误

C:rand()函数偶尔会导致Segmentation fault