• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

关于Lua的垃圾回收机制(1)----------Weak Reference(弱引用)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

垃圾收集

总的来说,lua比较智能,垃圾的回收对于程序员来说是相对透明的。然而再智能也比不过人,所以最好的方法是在智能回收的基础上再加上几种人工的辅助,让其发挥最大作用。弱引用表就是用来辅助垃圾回收机制的存在。

什么是弱引用表

首先看一段代码


上面的例子表明,当一个表的键引用了一个对象,那么即使后期这个对象为空,在这个表中这个键也会存在。这就是lua中的一个设定:任何被表引用的对象,即使你永远用不到它也没有其他地方引用它,它都不会被回收。 也就是说,我们如果想彻底把key1有关的信息都删除回收,那么我们只能手动的先去把 t[key1] = nil,再把 key1 = nil。但是这样也太麻烦了吧,程序员都是很懒的呀。那么有没有方法可以让我们省去手动的操作,自动的把我们不想要的对象回收呢?这就是弱引用表的作用了。它能让lua自动去回收一些不需要的对象,即使这个对象正在被这个弱引用表所引用。

弱引用表的三种模式

1.键为弱引用 __mode = “k”


最后结果只有wKey1,wKey2由于是作为weakT的键,当它被置位nil时,就被回收了。__mode = “k”,表明当弱引用表中的键引用的对象为空时,这个元素就会被回收。

2.值为弱引用 __mode = “v”

先看代码

首先定义一个弱引用表weakT,将它设置成值为弱引用的模式。定义两个表wKey1和wKey2,将它们作为weakT的值,将其中wKey2置位nil后垃圾回收,遍历weakT

不出意料,对于wKey2这个表来说,除了weakT外,再也没有引用它了,所以它就被回收了。所以总的来说,当你设置一个表__mode = "v"的时候,当表中的值所引用的对象为nil的时候,那么lua也会把这个值当做垃圾回收。emmmm,是不是很好理解。别急,继续看下面的特殊情况。
《Lua程序设计》讲到弱引用表的时候,说过一句:“请注意,只有对象可以从弱引用表中被移除,而像数字和bool这样的‘值’是不可回收的”。我用下面这个例子来解释这句话。


从结果看,weakT中的所有值都保留了,wKey1并没有被回收。这是因为wKey1是一个字符串,lua里面的字符串从程序员角度就是值类型,所以即使将它置位nil,也不会被回收。这就是书上那句话的意思。

键和值都为弱引用 __mode = “kv”

这就是上面两种情况的叠加,有兴趣的读者可以试下。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Nginx安装lua-nginx-module模块发布时间:2022-07-22
下一篇:
Lua访问网页发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap