Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用lua协同程序api和lua_close时出现分段错误_C++_Lua_Segmentation Fault_C Api - Fatal编程技术网

C++ 使用lua协同程序api和lua_close时出现分段错误

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

我正在处理一个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 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
}