C++ 和 Lua5.1-2 / LuaJIT

所以,我正在使用LuaJIT在C++应用程序中嵌入Lua5.1-2,并包括lua脚本“订阅”在C++代码中引发的事件的能力,并成功使用luaL_ref存储函数引用,并成功使用lua_rawgeti和lua_pcall调用函数。

问题在于,在大约1500次调用功能之后,应用程序会崩溃,但不会抛出任何异常。出于好奇,我决定在调用lua函数之前和之后监视堆栈,并注意到lua_gettop开始返回逐渐减少的负值:('it'是一个迭代器,用于迭代当前的“订阅者”,仅用于测试)

gameClient->appendToLog("Stack size before: " + std::to_string(lua_gettop(L));
lua_rawgeti(L, LUA_REGISTRYINDEX, it->second);
gameClient->appendToLog("Stack size [rawgeti]: " + std::to_string(lua_gettop(L));
int res = lua_pcall(L, 0, 0, 0);
gameClient->appendToLog("Stack size after: " + std::to_string(lua_gettop(L));

lua函数仅包含用于测试的日志调用:

function update()
    log("Lua tick")
end

这是输出内容:

Stack size before: 0
Stack size [rawgeti]: 1
Lua tick
Stack size after: 0

Stack size before: 0
Stack size [rawgeti]: 1
Lua tick
Stack size after: 0

...重复几百次,然后 。。

Stack size before: 0
Stack size [rawgeti]: 1
Lua tick
Stack size after: -1

Stack size before: -1
Stack size [rawgeti]: 0
Lua tick
Stack size after: -1

...还会重复50-300次,然后再次减少

Stack size before: -1
Stack size [rawgeti] 0
Lua tick
Stack size after: -2

Stack size before: -2
Stack size [rawgeti]: -1
Lua tick
Stack size after: -2

这最终导致应用程序崩溃。 lua函数没有返回值或参数,因此我没有主意。

注:这发生在lua函数中没有log()调用的情况下,我已经测试过了。

编辑:在lua_pcall之后调用lua_settop(L,0)可以防止崩溃,但我仍然想知道是什么导致了问题,以便我可以修复它。

点赞