在 Lua 中,当一个表不再使用时,我应该将所有的表元素赋值为 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

此外,如果表元素有一些属性被赋值给其他表,我需要逐个将它们赋值为nil吗?

for n=1,5
    myTable[n].someTable = nil
    myTable[n] = nil
end
myTable = nil
点赞
用户1009479
用户1009479

只需简单地分配 myTable = nil 就可以了。您可以使用 __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

这意味着所有的 item 表都被垃圾回收器收回了。

2014-02-12 03:46:39
用户3018595
用户3018595

所有都与引用有关。即使您将引用表的变量设为nil,如果还有对该表的另一个引用,则垃圾回收器不会释放内存。因为表仍然被“使用”。

例如:

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)

--输出结果
--table: 0x8ebb40
--nil
--table: 0x8ebb40

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

2014-02-12 03:51:43