让我们看看以下代码。
do
local a = {1,2,3}
function a:doSth()
self = nil
end
a:doSth()
if a then
print("Still has a...")
end
end
我发现这种方法不起作用。表a
仍然存在。为什么?
我知道a = nil
可以回收表a
所拥有的内存。
如何通过表a
直接获取内存并释放内存,就像在C ++中的delete
一样?
答案 0 :(得分:4)
function a:doSth()
self = nil
end
是
的语法糖function a.doSth(self)
self = nil
end
上面的代码中,对表值{1,2,3}
有两个不同的引用,一个是local a
,另一个是函数内的self
。 nil
其中一个引用并未更改对该表的其他引用。
要为gc集合考虑该表,您必须确保没有引用指向它。例如:
function a:doSth()
a = nil
end
这将通过a
释放引用,仍有来自self
的引用,但在函数结束时自动超出范围。在函数调用之后,gc将在下一个周期收集{1,2,3}
,假设没有其他内容引用该表。
答案 1 :(得分:1)
你可以这样做:
a = nil
collectgarbage()
但是我不建议运行完整的垃圾收集周期来解放1个表。垃圾收集需要时间,最好让Lua在它认为合适时运行它。