首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎么才能清理lua的注册表?

我怎么才能清理lua的注册表?
EN

Stack Overflow用户
提问于 2014-12-13 15:37:35
回答 1查看 872关注 0票数 6

如果我首先在lua的注册表中放置了一些内容:

代码语言:javascript
复制
int ref = luaL_ref(L, LUA_REGISTRYINDEX);

然后取消引用ref,并使用:

代码语言:javascript
复制
luaL_unref(L, LUA_REGISTRYINDEX, ref);

并使用以下内容启动垃圾收集器:

代码语言:javascript
复制
lua_gc(L, LUA_GCCOLLECT, 0);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-29 17:00:24

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

如果您确信注册表中没有活动引用,则可以手动清除整数项(请参见下面的说明)。如果您想要一个完全空的注册表,那么lua_newtable(L), lua_replace(L, LUA_REGISTRYINDEX)就会这样做。不过,这不是个好主意--参见下面的评论。

(请注意,您可能不能简单地检查是否所有的引用都是平衡的,因为一些代码可能会引用一个整数值。不过,我可能错了。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27460543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档