如何删除Lua中的表?

时间:2015-01-21 07:29:04

标签: lua lua-table

让我们看看以下代码。

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一样?

2 个答案:

答案 0 :(得分:4)

function a:doSth()
    self = nil
end

的语法糖
function a.doSth(self)
    self = nil
end

上面的代码中,对表值{1,2,3}有两个不同的引用,一个是local a,另一个是函数内的selfnil其中一个引用并未更改对该表的其他引用。

要为gc集合考虑该表,您必须确保没有引用指向它。例如:

function a:doSth()
    a = nil
end

这将通过a释放引用,仍有来自self的引用,但在函数结束时自动超出范围。在函数调用之后,gc将在下一个周期收集{1,2,3},假设没有其他内容引用该表。

答案 1 :(得分:1)

你可以这样做:

a = nil
collectgarbage()

但是我不建议运行完整的垃圾收集周期来解放1个表。垃圾收集需要时间,最好让Lua在它认为合适时运行它。