本文主要是介绍Lua程序设计(六十二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
有关析构器的另一个微妙之处在于复苏(resurrection)。当一个析构器被调用时,它的参数是正在被析构的对象。因此,这个对象会至少在析构期间重新变成活跃的。这通常被称为临时复苏(transient resurrection)。在析构器进行期间,我们无法阻止析构器把该对象存储在全局变量中,使得该对象在析构器返回后仍可访问,这就被称为永久复苏(permanent resurrection)。
复苏必须是可以传递的,考虑如下代码
A = {x = "this is A"
B = {f = A}
setmetatable(B, {__gc = function (o) print(o.f.x) end})
A, B = nil
collectgarbage() -->this is A
B的析构器访问了A,因此A在B析构前不能被回收,Lua语言在运行析构器之前必须同时复苏B和A。
由于复苏的存在, Lua语言会在两个阶段中回收具有析构器的对象。当垃圾收集器首次发现某个具有析构器的对象不可达时,垃圾收集器就把这个对象复苏并将其放入等待被析构的队列中。一旦析构器开始执行,Lua语言就将该对象标记为已析构。当下一次垃圾收集器又发现这个对象不可达时,它就将这个对象删除。如果想保证程序中的所有垃圾均被真正地释放了的话, 那么则必须调用collectgarbage两次,第二次调用才会删除第一次调用中被析构的对象。
由于
这篇关于Lua程序设计(六十二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!