如何防止 Lua C API 的注册表中的回调函数被垃圾回收?

我在我的 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("回调已注册:%s\n", pEventName);
    for (int i = 0; i < 64; i++) {
        if (luaEventHandlerList[i] != 0)
            continue;
        luaEventHandlerList[i] = eventHandler;
        break;
    }
    return eventHandler;
}
点赞
用户11694683
用户11694683

问题是糟糕的内存管理。

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

2019-07-31 21:12:00