之前写过一篇博客专门介绍了weak表:Lua弱引用表-优快云博客,这两天阅读了《programming in lua》后有了些新的体会,在这里只做一些之前没有了解的补充内容。
定义
Lua 自动进行内存的管理。程序只能创建对象(表,函数等),而没有执行删除对象的函数,相反,Lua会自动删除那些失效的对象。垃圾收集器只能在确认对象失效之后才会进行收集;它是不会知道你对垃圾的定义的。类似于任何在全局变量中声明的对象,都不是 Lua 认为的垃圾,即使你的程序中根本没有用到他们。Lua weak表就是为这而诞生的:
Weak 表是一种用来告诉Lua一个引用不应该防止对象被回收的机制。一个weak引用是指一个不被Lua认为是垃圾的对象的引用。如果一个对象所有的引用指向都是weak,对象将被收集,而那些weak引用将会被删除。Lua通过weak tables来实现weak引用:一个 weak tables 是指所有引用都是weak的table。这意味着,如果一个对象只存在于 weak tables 中,Lua 将会最终将它收集。
表的弱引用性通过其__mode来定义。 表有keys和values,所以weak也分key weak和value weak。如若key是weak属性的,则__mode = "k";如若value是weak属性的,则__mode = "v";如若两者都是,则__mode = "