【lua】弱引用table(__mode)


弱引用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來實現緩存等機制,熱數據不會被回收,不用的數據自動釋放


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM