C++ 使用lua协同程序api和lua_close时出现分段错误
我正在处理一个lua脚本中断项目,我想使用std::Stack和lua协程来保存上下文。但当我将stacksize设置为38以上时,它会在lua_resume和lua_close中随机崩溃。 test.lua:C++ 使用lua协同程序api和lua_close时出现分段错误,c++,lua,segmentation-fault,c-api,C++,Lua,Segmentation Fault,C Api,我正在处理一个lua脚本中断项目,我想使用std::Stack和lua协程来保存上下文。但当我将stacksize设置为38以上时,它会在lua_resume和lua_close中随机崩溃。 test.lua: local stacksize = 40 --When changing stacksize less than 30, it runs fine. function heavy_function(i) print("heavy_function start",i) if
local stacksize = 40 --When changing stacksize less than 30, it runs fine.
function heavy_function(i)
print("heavy_function start",i)
if i < stacksize then
coroutine.yield(i+1)
end
print("heavy_function end",i)
end
我怀疑我在调用lua_newthread时犯了一个错误。因此,在调用lua_newstate之前,我进行了堆栈检查,结果一切正常
if(ret == LUA_YIELD)
{
init = luaL_checkinteger(Lstack.top(),-1);
Lstack.push(lua_newthread(L));
cout<<"lua_checkstack(L,10) = "<<lua_checkstack(L,1)<<endl;//Add a line in line 47
}
if(ret==LUA\u收益率)
{
init=luaL_checkinteger(Lstack.top(),-1);
Lstack.push(lua_newthread(L));
cout通过不断生成新的Lua线程并将其Lua对象留在堆栈上,您正在溢出Lua堆栈
lua\u newstack()
快速而肮脏的“修复”方法是在Lstack.push(lua\u newthread(L))之前调用lua\u checkstack(L,10);
line。它允许代码按原样运行,但堆栈会不断增长。相反,您应该从堆栈中取出新的线程对象,并将其放在某个Lua表中,直到删除它为止。衷心感谢您的回答。我将新线程推到一个表中,效果很好。
g++ -g main.cpp -o test -llua -ldl
if(ret == LUA_YIELD)
{
init = luaL_checkinteger(Lstack.top(),-1);
Lstack.push(lua_newthread(L));
cout<<"lua_checkstack(L,10) = "<<lua_checkstack(L,1)<<endl;//Add a line in line 47
}