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

时间:2014-02-12 03:26:26

标签: 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

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

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

2 个答案:

答案 0 :(得分:5)

只需指定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表。

答案 1 :(得分:0)

所有都是关于参考。即使你已经设置为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)

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

如果某个表被引用(甚至在另一个表中),则不会释放它。