我如何清理lua的注册表?

如果我使用以下方式将某物放入 Lua 的注册表中:

int ref = luaL_ref(L, LUA_REGISTRYINDEX);

然后使用以下方式取消对 ref 的引用:

luaL_unref(L, LUA_REGISTRYINDEX, ref);

并使用以下方式启动垃圾回收器:

lua_gc(L, LUA_GCCOLLECT, 0);

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

点赞
用户3125367
用户3125367

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

如果您确信注册表中没有任何活动引用,则可以手动清除整数键(请参阅下面的注意事项)。如果您想要完全空的注册表,那么 lua_newtable(L), lua_replace(L, LUA_REGISTRYINDEX) 将实现该功能。虽然这不是一个好主意——请参阅本回答下面的评论。

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

2015-06-29 17:00:24