垃圾回收器收集死对象时做了什么?

请按照我的输入注释(使用 Lua 5.3.2 在 JDoodle):

local table = {};

local weakvalues = setmetatable(
{
    table
},
{
    -- 让 weakvalues 的值成为弱引用,因此在死对象被垃圾回收时它们会过期。
    __mode = 'v'
});

table = _;

-- 现在,之前被引用的 table 是不可达的
-- 因为没有其它的引用,我想应该是这样...

-- 同步等待这个 loop 语句
-- 以便执行下一个语句(也许垃圾回收器在执行此循环时
-- 就已收集了上面不可达的表格...
for i = 1, 5e7 do end

-- 期望记录 0,但是记录了 1。不可达的 table
-- 仍然可以被引用吗?
print(#weakvalues);

我认为在将 table 赋值为 nil 后,table 上的表将删除 weakvalues [1]

点赞
用户2328287
用户2328287

你的代码没有调用垃圾回收函数。 试试这段代码:

local t = {}
local weakvalues = setmetatable({t},{ __mode = 'v'})
t = nil
collectgarbage() collectgarbage()
print(#weakvalues);
2016-12-14 13:28:53