弱引用table
lua使用自動內存管理機制,通過垃圾回收器來回收內存
垃圾回收器只能回收它認為是垃圾的內容,而不能回收用戶認為是垃圾的內容
典型的例子棧,棧一般用一個數組和一個表示頂部的索引值表示
如果彈出一個元素,那么僅是把棧頂索引減一,
但這個元素還留在內存在被這棧數組引用着,所以垃圾回收器不知道它是垃圾
全局變量和table里的內容會被垃圾回收器回收,只能手動置為nil
因此需要一種與回收器可以協作的機制,這就是弱引用(weak reference)
lua里用弱引用table(weak table)來實現這個機制
3種弱引用table
1.具有弱引用key的table
2.具有弱引用value的table
3.同時具有弱引用key和弱引用value的table
無論是哪種類型的弱引用table,只要有一個key或value被回收了
那么他們所在的整個條目都會從table中刪除
table的弱引用類型通過其元表中的__mode字段來決定,這個字段是一個字符串
1.__mode字段中如果包含"k"則是key的弱引用
2.__mode字段中如果包含"v"則是value的弱引用
3.__mode字段中包含"k"和"v"則是key、value的弱引用
a={}
b={__mode="k"}
setmetatable(a,b)
--table a的key就是弱引用
key={}
--創建第一個key
a[key]=1
key={}
--創建第二個key
a[key]=2
collectgarbage()
--強制進行一次垃圾收集
for k,v in pairs(a) do print(v) end
--> 2
第二次key={}會覆蓋第一個key,這時再沒有對第一個key的引用了,所以會回收
第二個key由於還被變量key引用,所以不會回收
lua只會回收用弱引用table中的對象
如果key是number、boolean、string則不會回收,所以上例中用table來當key
可以使用弱引用table來實現緩存等機制,熱數據不會被回收,不用的數據自動釋放