本文主要是介绍Lua基础之弱引用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简述
一个table可以通过元表的__mode字段设置成弱引用模式,一般来说由三个模式:
- key是弱引用
- value是弱引用
- key和value都是弱引用
-- 设置a为key弱引用
a = {}
b = {__mode = "k"}
setmetatable(a, b)-- 设置a为value弱引用
a = {}
b = {__mode = "v"}
setmetatable(a, b)-- 设置a为key和value弱引用
a = {}
b = {__mode = "k, v"}
setmetatable(a, b)
作用
Lua采用垃圾自动回收的内存管理机制,但有时候Lua并不能正确判断对象是否需要被销毁,导致某些需要被销毁的对象一直存在,造成内存泄漏。
如下代码Test.lua,
a = {}
key = {}
a[key] = 1
key = {}
a[key] = 2
collectgarbage()
for k,v in pairs(a) doprint(k, v)
end
输出为,
程序本身的意料是,但key第二次被赋值为{}时,a[key] = 1就不存在了,因为之前key的内容已经不被现在的key所引用。可是遍历table a是还有value为1的情况出现,那是因为key第二次被赋值为{}之前,已经存在table a对key的引用,key所指向的内容还存在于table a中。
已知Lua自动回收机制在执行一次内存清理过程中会遍历所有的弱引用table,并根据弱引用设置删除其中未被标记的key和value。为了达到程序意料中的情况,就需要使用弱引用。
如下代码Test.lua,
a = {}
b = {__mode = "k"}
setmetatable(a,b)
key = {}
a[key] = 1
key = {}
a[key] = 2
collectgarbage()
for k,v in pairs(a) doprint(k, v)
end
输出为,
将table a的key设置为弱引用模式,当key第二次被赋值为{}时,key已经不再引用原来的内容,原来a[key] = 1的key和value就会被回收。
同理table a的设置为value弱引用模式的情况,
a = {}
b = {__mode = "v"}
setmetatable(a, b)
value = {}
a[1] = value
value = {}
a[2] = value
collectgarbage()
for k,v in pairs(a) doprint(k, v)
end
参考链接
https://www.cnblogs.com/jadeboy/p/4183365.html
这篇关于Lua基础之弱引用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!