如果我首先在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能够收集它们?
发布于 2015-06-29 17:00:24
正如@siffiejoe在评论中指出的那样,Lua的辅助库使用“自由职业者”机制来跟踪自由索引漏洞,并且该列表永远不会缩小,即它的大小总是等于峰值分配,即大小与速度的权衡。您可以检查实现以找出底层逻辑。
如果您确信注册表中没有活动引用,则可以手动清除整数项(请参见下面的说明)。如果您想要一个完全空的注册表,那么lua_newtable(L), lua_replace(L, LUA_REGISTRYINDEX)就会这样做。不过,这不是个好主意--参见下面的评论。
(请注意,您可能不能简单地检查是否所有的引用都是平衡的,因为一些代码可能会引用一个整数值。不过,我可能错了。)
https://stackoverflow.com/questions/27460543
复制相似问题