[英]Is it possible to deadlock memory in Lua like this?
这两个表都相互引用,但都没有在函数之外的任何其他地方被引用。 调用 f() 后这些表会保留在内存中还是会被垃圾收集?
function f()
local t1 = {}
local t2 = {}
t1[1] = t2
t2[1] = t1
end
f()
这两个表将被垃圾收集。
t1
和t2
是f
范围的本地。 一旦它们用完范围t1[1]
和t2[1]
不再存在。
不再有对这两个表的引用,因此它们有资格进行垃圾收集。
Lua 的垃圾收集检查可达性而不是仅仅使用引用计数,因此循环引用不会阻止收集。 这是您程序的修改版本,用于演示这一点:
function f()
local t1 = setmetatable({}, {__gc = function() print "Collected t1" end})
local t2 = setmetatable({}, {__gc = function() print "Collected t2" end})
t1[1] = t2
t2[1] = t1
end
f()
print "Before collectgarbage()"
collectgarbage()
print "After collectgarbage()"
我得到的结果:
Before collectgarbage()
Collected t2
Collected t1
After collectgarbage()
请注意,表上的__gc
元方法是 Lua 5.2 的新内容。 如果你想在旧版本的 Lua 上尝试这个演示,你需要使用newproxy
或以其他方式获取用户数据来代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.