Lua 弱表与垃圾回收机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youshijian99/article/details/79970903

弱表

weak表是一个表,它拥有metatable,并且metatable定义了 _mode 字段
weak表中的引用是弱引用,弱引用不会导致对象的引用计数变化。
如果一个对象只有弱引用指向它,那么垃圾回收(gc)会自动回收该对象的内存。

_mode 字段可以取3个值: k  v  kv

k v 是表的键值, 都属于weak,任何情况下只要有一个被gc回收,那么 k v 都会被从表中移除

例程

t = {}
t1 = {}
t2 = {}
t[1] = t1
t[2] = t2
t[3] = 2
t1 = nil
t2 = nil
print(table.getn(t))
collectgarbage();	-- 垃圾回收
print(table.getn(t))

运行结果
3
3

例程

t = {}
t1 = {}
t2 = {}
t[1] = t1
t[2] = t2
t[3] = 2
setmetatable(t, {__mode = "v"}) -- 设置为弱表, 引用计数不会增加
t1 = nil
t2 = nil
print(table.getn(t))
collectgarbage();	-- 垃圾回收
print(table.getn(t))

运行结果
3
0

例程

t = {}
tb = {x = 10, y = 20, z = t}	-- z 引用t
setmetatable(t, {__mode = "v"})	-- 设置之后 t 的表的引用计数为1,不会增加为2
for k, v in pairs(tb) do
	print(k, type(k), v, type(v))
end

运行结果

y string 20 number
x string 10 number
z string table: 0027B550 table

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页