Lua中是否可能像这样死锁?

这两个表都相互引用,但在函数外没有任何其他引用。在调用f()后,这些表将保留在内存中还是将被垃圾回收?

function f()
     local t1 = {}
     local t2 = {}
     t1[1] = t2
     t2[1] = t1
end

f()
点赞
用户2858170
用户2858170

下面是翻译后的中文:

两个表将被垃圾回收。

t1t2 局限于 f 的作用域中。一旦它们超出作用域,t1[1]t2[1] 将不再存在。

不再有对这两个表的引用,因此它们符合垃圾回收的条件。

2021-07-17 09:05:06
用户7509065
用户7509065

Lua的垃圾回收通过检查可达性而不是仅使用引用计数,因此循环引用不会阻止回收。以下是一个修改过的程序来演示这一点:

function f()
     local t1 = setmetatable({}, {__gc = function() print "收集 t1" end})
     local t2 = setmetatable({}, {__gc = function() print "收集 t2" end})
     t1[1] = t2
     t2[1] = t1
end

f()
print "在执行 collectgarbage() 之前"
collectgarbage()
print "在执行 collectgarbage() 之后"

我得到的结果是:

在执行 collectgarbage() 之前
收集 t2
收集 t1
在执行 collectgarbage() 之后

请注意,表上的__gc元方法是 Lua 5.2 新增的功能。如果您想在旧版本的 Lua 上尝试此演示,则需要使用 newproxy 或以其他方式获取一个用户数据。

2021-07-17 20:04:50