[Lua] table的 弱引用 和 强引用

43 篇文章 1 订阅
26 篇文章 3 订阅

转自:https://www.cnblogs.com/lyh916/p/7899815.html

参考:http://www.benmutou.com/archives/1808

一.强引用table

lua中的table是引用类型,更准确地说,是强引用类型。如下第二段代码,在内存中有一个{name = "123"}的table,并用a和b[1]指向它,然后置空a,此时就只剩下b[1]指向它了。这种引用方式和我们所认知的引用是一样的。值得一提的是,这里的a = nil为什么不等同于{name = "123"} = nil呢,意思是将指向的这个表删掉呢?因为lua是具备自动内存管理的,我们只管创建,删除操作是lua自动进行的,因此这里的a = nil并不是删除表,而是指将a对这张表的引用去掉,当没有地方引用这张表时,这张表就会被lua自动清掉。

a = {name = "123"}
b = a
a.name = "456"
print(b.name)--456
a = {name = "123"}
b = {}
b[1] = a
a = nil
print(b[1].name)--123

二.弱引用table

如上所说,一般我们创建的table都是强引用table,即key和value都是强引用,强引用可以防止他们指向的对象被回收。如果一个对象存在强引用,那么它就不会被回收。而相对地,就有弱引用,弱引用不能防止对象被回收。如果一个对象只存在弱引用,那么它就会被回收。lua中通过弱引用table来实现弱引用。弱引用table有三种形式:

1.key值弱引用。设置方法为setmetatable(b, {__mode = "k"})

2.value值弱引用。设置方法为setmetatable(b, {__mode = "v"})

3.key和value值弱引用。设置方法为setmetatable(b, {__mode = "kv"})

当一个key或者value被收集时,整个key以及对应的value都会从table中移除。

如下所示,{name = "123"}这个table存在强应用b[1],所以没被回收。

a = {name = "123"}
b = {}
b[1] = a
a = nil
collectgarbage()
for k,v in pairs(b) do
    print(k) --1
    print(v) --table: 0054E430
end

下面新增一句代码,表示b的value对其指向的对象的引用是弱引用,而b的key对其指向的对象的引用仍然是强引用(对于table来说,其key和value可以指向任何类型的对象,除了key不能指向nil)。{name = "123"}这个table只存在弱应用b[1],所以被回收。

a = {name = "123"}
b = {}
setmetatable(b, {__mode = "v"}) --add
b[1] = a
a = nil
collectgarbage()
for k,v in pairs(b) do
    print(k) --无
    print(v) --无
end

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值