如何在Lua中删除一个表?

让我们看下面的代码。

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

点赞
用户234175
用户234175
函数 `a:doSth()` 是语法糖,相当于:

function a.doSth(self) self = nil end


你上面的代码中,有两个不同的表值引用 `{1,2,3}`,一个是通过 `local a` 访问的,另一个是在函数内部通过 `self` 访问的。将其中一个引用设置为 `nil` 不会改变对该表的另一个引用。

要让该表被视为垃圾回收,你必须确保没有任何引用指向它。例如:

function a:doSth() a = nil end

```

这将释放 a 对该表的引用,但 self 对它的引用仍然存在,但在函数结束时会自动超出作用域。如果没有其他东西引用该表,下一个循环中垃圾回收器将回收 {1,2,3}

2015-01-21 07:48:22
用户312586
用户312586

你可以这样做:

a = nil
collectgarbage()

然而,我不建议仅仅为了释放一个表格而运行完整的垃圾收集周期。垃圾回收需要时间,最好让 Lua 在适当时运行它。

2015-01-21 09:22:02