Memory leaks 在Lua中,当它';它没用吗?

Memory leaks 在Lua中,当它';它没用吗?,memory-leaks,lua,garbage-collection,lua-table,Memory Leaks,Lua,Garbage Collection,Lua Table,例如,我以这种方式创建了一个表 myTable = {} for n=1,5 local item = { name = "item"..n, id = n, } myTable[n] = item end 当此表不再使用时,为了向垃圾收集器释放此表 我是否需要在表中循环以将每个元素分配给nil for n=1,5 myTable[n] = nil end 或者我只需要将表赋值为nil myTable = nil 除上述内容外

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

myTable = {}
for n=1,5
    local item = {
        name = "item"..n,
        id = n,
    }
    myTable[n] = item
end
当此表不再使用时,为了向垃圾收集器释放此表

我是否需要在表中循环以将每个元素分配给nil

for n=1,5
    myTable[n] = nil
end
或者我只需要将表赋值为nil

myTable = nil
除上述内容外,如果table元素具有分配给其他表的某些属性,我是否也需要单独将它们置零

for n=1,5
    myTable[n].someTable = nil
    myTable[n] = nil
end
myTable = nil

只需分配
myTable=nil
即可。您可以使用
\uu gc
元方法进行如下测试:

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()
输出:

item 5 collected
item 4 collected
item 3 collected
item 2 collected
item 1 collected

这意味着所有
表都是由垃圾收集器收集的。

都是关于引用的。即使将引用表的变量设置为nil,如果存在对该表的另一个引用,垃圾收集器也不会释放内存。因为这张桌子还在使用中

例:


如果一个表被引用到任何地方(甚至在另一个表中),它不会被释放。

是的,我理解你的观点,但这与我的问题有点不同。这只是为了重新思考这个问题。简而言之:如果表上没有元素或者表本身没有引用,那么如果您像Yu Hao显示的那样将其置零,那么将收集该表。我的最后一个问题如何:如果表项具有分配给其他表的属性,我是否也需要将其置零?或者,只要
myTable=nil
就行了?@Joe同样,
myTable=nil
也行。Lua垃圾收集器知道另一个表不再在此表中被引用,并且最终会在它没有被引用时收集它。
myTable = {}
myOtherTable = myTable
for n=1,5 do
    local item = {
        name = "item"..n,
        id = n,
    }
    myTable[n] = item
end

print(myTable)
myTable=nil
print(myTable)
print(myOtherTable)

--OUTPUT
--table: 0x8ebb40
--nil
--table: 0x8ebb40