繁体   English   中英

是否有可能像这样在 Lua 中死锁内存?

[英]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()

这两个表将被垃圾收集。

t1t2f范围的本地。 一旦它们用完范围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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM