lua有gc。細節無需太關注,知道些主要的即可。能local就一定不要global;
還有在陣列裡的物件,除非顯式=nil,否則非常難**;
只是能夠用弱引用表來告訴gc。外部引用為0,就不要管我,請del it。
weak table是通過元表實現,元表裡的__mode欄位包括k或者v;k表示key為弱引用;v表示value為弱引用。
1、首先看乙個普通的樣例:
a = {}
key = {}
a[key] = 1
key = {}
a[key]=2
collectgarbage()
for k,v in pairs(a)
do print(v)
end
輸出是:
>lua -e "io.stdout:setvbuf 'no'" "test.lua" 12
>exit code: 0
這裡沒有什麼,就是把a裡的東西所有列印出來了。
2、然後設定a的元表 包括k,就表示a的key是弱引用
a = {}
b =
setmetatable(a, b)
key = {}
a[key] = 1
key = {}
a[key]=2
collectgarbage()
for k,v in pairs(a)
do print(v)
end
key經過一次覆蓋,除了a沒有其它引用,並且由於a的key為弱引用,所以能夠**了。正如預料輸出:
>lua -e "io.stdout:setvbuf 'no'" "test.lua"
2>exit code: 0
3、然後看乙個value為weak table的樣例:
a = {}
b =
setmetatable(a, b)
key =
a[1] = key
key =
a[2]= key
collectgarbage()
for k,v in pairs(a) do
for m,n in pairs(v)
do print(n)
endend
key經過覆蓋。前乙個被**啦。
終於輸出:
>lua -e "io.stdout:setvbuf 'no'" "test.lua"
13>exit code: 0
經過上面的分析,你稍微明確weak table木有。假設木有,那就再看看書吧。
lua弱引用表weak table的用途
目錄 1.簡介 2.定義 3.示例 示例1示例2 4.應用 1.記憶 快取 函式 示例1示例2 2.設定表的預設值 1 lua的gc預設是自動 的,當乙個物件的引用計數為0時,它就會被gc所 2 lua中的表預設是強引用的,當你把某個物件放入表中時,就是生成乙個對它的強引用 物件的引用計數 1 在物...
Lua教程(十三) 弱引用table
lua採用了基於垃圾收集的記憶體管理機制,因此對於程式設計師來說,在很多時候記憶體問題都將不再困擾他們。然而任何垃圾收集器都不是萬能的,在有些特殊情況下,垃圾收集器是無法準確的判斷是否應該將當前對程式設計客棧象清理。這樣就極有可能導致很多垃圾物件無法被釋放。為了解決這一問題,就需要lua的開發者予以...
弱符號與強符號,弱引用與強引用
對c c 而言,編譯器預設函式和初始化了的全域性變數為強符號。未初始化的全域性變數為弱符號。此處弱符號與強符號均是針對定義來說的,不是針對符號的引用。也可以通過gcc的 attribute weak 來定義任何乙個強符號為弱符號。cpp view plain copy extern in ext i...