gpt4 book ai didi

c - 我怎样才能清理lua的注册表?

转载 作者:太空狗 更新时间:2023-10-29 17:26:03 25 4
gpt4 key购买 nike

如果我首先将一些东西放入 lua 的注册表中:

int ref = luaL_ref(L, LUA_REGISTRYINDEX);

然后取消引用 ref :

luaL_unref(L, LUA_REGISTRYINDEX, ref);

并启动垃圾收集器:

lua_gc(L, LUA_GCCOLLECT, 0);

当我打印注册表时,我仍然可以在注册表中看到 ref 条目。为什么 luaL_unref 不删除未引用的条目,以便 gc 可以收集它们?

最佳答案

正如@siffiejoe 在评论中指出的那样,Lua 的辅助库使用“freelist”机制来跟踪空闲索引空洞,并且该列表永远不会缩小,即它的大小始终等于峰值分配——这是大小与速度的权衡.您可以检查实现以找出底层逻辑。

如果您确定注册表中没有剩余的事件引用,您可以手动清除整数键(见下面的注释)。如果你想要一个完全空的注册表,那么 lua_newtable(L), lua_replace(L, LUA_REGISTRYINDEX) 就可以了。但这不是一个好主意——请参阅此答案下方的评论。

(请注意,您可能无法简单地检查所有引用是否平衡,因为某些代码可能会引用一个整数值。虽然我在这方面可能是错误的。)

关于c - 我怎样才能清理lua的注册表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27460543/

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