例如,我以这种方式创建了一个表
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
答案 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
如果某个表被引用(甚至在另一个表中),则不会释放它。