当 C 中的对象向量中有太多lua_state时,lua_close() 崩溃
lua_close() crash when there is too many lua_state in an vector of objects in C
所以有一个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);
}
在效果的生命周期结束时调用没有这个关闭,它将开始吃掉我的公羊但是如果我使用它,并且创建了 lot 的 Effect 对象,那么事情会崩溃并显示
访问冲突(分段错误)
有人知道如何解决这个问题吗?
还是我应该更改脚本语言?
似乎我两次关闭了一个状态,但是lua_close(G)位于同一向量中的不同对象中,我只是想出一种方法,也许我也可以lua_states放在一个向量中?
问题解决了! 我所做的是将lua_state对象设为私有,并且不再崩溃,这可能是因为lua_state指针被复制到其他地方,所以现在在我将其设为私有后,它不再可复制了!
所以首先在标题中,私有部分声明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++Lua用户数据扰乱了Mathfu浮点值
- 使用 LuaBridge 或 Lua 将对象传递给 Lua 函数C++
- ofstream::close() 是否在 Linux 上调用同步?
- 将 Lua 函数块转换为 C 字符串
- 我可以从 lua 5.0.2 加载用 c++ 编写的 lua 5.3.5 dll 吗?
- 使用 lua 协程 API 和lua_close时出现分段错误
- 使用 C++ 自动 Lua 绑定
- 调用 lua 函数的地址为 C/C++?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- 如果我在字符数组上使用 close() 会发生什么?
- 如何将 Lua 添加到C++项目
- 使用 Lua 中的C++库对象
- 如何在C++中将用户数据从一个 Lua 块传递到另一个块
- 如何使用重新定义的打印函数打印Lua表?
- Lua table in C++ dll
- 在运行时环境中使用 C++ w/ Lua
- 将shared_ptr传递给Lua
- luaL_len is missing in Lua 5.1
- 将向量传递给<struct> Lua 表
- 将 Lua 与 C++ DLL 结合使用