zoukankan      html  css  js  c++  java
  • Chapter 17_4 终结器

      Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作。

      可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器。

      Lua用"__gc" 元方法实现终结器:

    o = {x  = "hi" }
    setmetatable(o , {__gc = function (o ) print (o.x) end } )
    o = nil
    collectgarbage()  --> hi       -- 触发元方法__gc

    如果我们没有对对象进行__gc标记,它就不会终结。

    在它之后才给元表加上这个__gc域,那么这个对象是没有被标记需要触发终结器的:

    o = { x = "hi"}
    mt = {}
    setmetatable(o,mt )
    mt.__gc = function(o) print(o.x) end
    o = nil
    collectgarbage()   -->  不会打印任何东西

    在标记__gc域后,还是可以自由地改变其元表中的 “__gc” 域:

    o = {x = "hi" }
    mt = {__gc = true }             --先用任何值给它赋值,作为占位符
    setmetatable(o, mt )
    mt.__gc = function(o) print (o.x) end   --再次修改,也是可以的
    o = nil
    collectgarbage()   --> hi

    当用同一个循环对几个对象进行垃圾回收,调用终结器的顺序和标记对象__gc域的顺序刚好相反。

    mt = { __gc = function (o) print (o[1]) end }
    list = nil
    for i = 1, 3 do
        list = setmetatable({i , link = list}, mt )
    end
    list = nil
    collectgarbage()
    --> 3
    --> 2 
    --> 1

    未完待续.....

    以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

  • 相关阅读:
    [CQOI2007]涂色
    NOI.AC NOIP模拟赛 第五场 游记
    AGC018D Tree and Hamilton Path
    AGC001E BBQ Hard
    LOJ6089 小Y的背包计数问题
    UOJ272 【清华集训2016】石家庄的工人阶级队伍比较坚强
    Gym102538A Airplane Cliques
    AT5762 Preserve Diameter
    CF1030G Linear Congruential Generator
    CF1149E Election Promises
  • 原文地址:https://www.cnblogs.com/daiker/p/5886440.html
Copyright © 2011-2022 走看看