在Lua中,我应该在不使用时将所有表元素分配给nil吗?

Joe*_*ang 3 lua garbage-collection memory-leaks lua-table

例如,我以这种方式创建了一个表

myTable = {}
for n=1,5
    local item = {
        name = "item"..n,
        id = n,
    }
    myTable[n] = item
end
Run Code Online (Sandbox Code Playgroud)

当不再使用此表时,为了为垃圾收集器释放此表,

我是否需要遍历表格以将每个元素分配给nil?

for n=1,5
    myTable[n] = nil
end
Run Code Online (Sandbox Code Playgroud)

或者我只需要将表分配给nil?

myTable = nil
Run Code Online (Sandbox Code Playgroud)

如果除了上面的内容之外,如果表元素有一些属性被分配给其他表,我是否也需要单独为它们添加?

for n=1,5
    myTable[n].someTable = nil
    myTable[n] = nil
end
myTable = nil
Run Code Online (Sandbox Code Playgroud)

Yu *_*Hao 5

简单分配myTable = nil就好了.你可以使用__gcmetamethod 测试它:

myTable = {}
for n=1,5 do
    local item = {
        name = "item"..n,
        id = n,
    }
    setmetatable(item, {__gc = function (self) print("item " .. n .." collected") end})
    myTable[n] = item
end

myTable = nil

collectgarbage()
Run Code Online (Sandbox Code Playgroud)

输出:

item 5 collected
item 4 collected
item 3 collected
item 2 collected
item 1 collected
Run Code Online (Sandbox Code Playgroud)

这意味着item垃圾收集器会收集所有表.