【问题标题】:How to delete a table in Lua?如何在 Lua 中删除表?
【发布时间】:2015-03-19 15:34:06
【问题描述】:

让我们看看下面的代码。

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 持有的内存。 如何像 C++ 中的delete 一样直接获取表a 持有的内存并释放内存?

【问题讨论】:

    标签: lua lua-table


    【解决方案1】:
    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 的引用,但函数结束时会自动超出范围。在函数调用之后,{1,2,3} 将在下一个循环中被 gc 收集,假设没有其他内容引用该表。

    【讨论】:

    • 但是如何直接获取表'a'持有的内存地址并像C++中的'delete'一样释放内存呢?谢谢。
    • 答案是你不知道。 Lua 是一种垃圾收集脚本语言,其安全性的一部分意味着不允许您手动处理低级别的资源。你能得到的最接近的是nil 出引用,然后打电话给collectgarbage()
    • 您不需要将变量设置为nil。您只需要停止引用该表。一种方法是限制变量的范围。另一种方法是将其设置为一个新表,这允许您编写假定它始终引用 some 表的代码。
    【解决方案2】:

    你可以这样做:

    a = nil
    collectgarbage()
    

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

    【讨论】:

    • 仅仅 collectgarbage() 是不够的。只有在没有其他对同一张表的实时引用时,它才会起作用。
    • 我们可以通过查看 OP 的示例代码来假设没有其他引用。
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 2011-06-20
    • 2020-08-28
    • 2010-12-18
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多