gpt4 book ai didi

c++ - 如何防止 C API 注册表中的 Lua 回调被垃圾收集?

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:33 26 4
gpt4 key购买 nike

我在我的 C 程序中使用 Lua 5.3 回调系统。 Lua 脚本只运行一次,以注册回调。我想在不完全禁用 GC 的情况下阻止回调被 GC。

回调代码:

LuaEventHandler* presentEvent = FindLuaEvent("present");
if (presentEvent != NULL) {
lua_rawgeti(lState, LUA_REGISTRYINDEX, presentEvent->luaFuncRef);
lua_pushvalue(lState, 1);
lua_pcall(lState, 0, 0, 0);
//presentEvent->luaFuncRef = luaL_ref(lState, LUA_REGISTRYINDEX);
}

回调添加代码:

LUACFUNCTION(RegisterCallbackLua) {
int ref = luaL_ref(lState, LUA_REGISTRYINDEX);
const char* name = luaL_checkstring(lState, 1);
RegisterLuaEvent(ref, name);
return 0;
}

LuaEventHandler* RegisterLuaEvent(int pLuaFuncRef, const char* pEventName) {
LuaEventHandler* eventHandler = new LuaEventHandler();
eventHandler->luaFuncRef = pLuaFuncRef;
eventHandler->eventName = pEventName;
printf("Callback registered: %s\n", pEventName);
for (int i = 0; i < 64; i++) {
if (luaEventHandlerList[i] != 0)
continue;
luaEventHandlerList[i] = eventHandler;
break;
}
return eventHandler;
}

最佳答案

问题是糟糕的内存管理。

luaEventHandlerList 应该是一个 vec,我直接引用了一个 lua 字符串等等

关于c++ - 如何防止 C API 注册表中的 Lua 回调被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56744778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com