【问题标题】:Are numbers, bools or nils garbage collected in Lua?Lua 中是否收集了数字、布尔值或 nils 垃圾?
【发布时间】:2013-03-07 05:37:22
【问题描述】:

This article 表示除数字、布尔值和 nil 之外的所有类型都被垃圾回收。

gc 字段用于其他值(字符串、表、函数、大量用户数据和线程),这些值是垃圾回收的对象。

这是否意味着在某些情况下过度使用这些非 gc 类型可能会导致内存泄漏?

【问题讨论】:

  • Vanilla Lua 是安全的,无论 Lua 代码中使用什么数据类型,内存泄漏都是不可能的。只有 C 端的错误代码才会导致内存泄漏。

标签: memory-leaks garbage-collection lua


【解决方案1】:

在 Lua 中,实际上有 2 种类型:始终按值传递的类型,以及按引用传递的类型(根据 chapter 2.1 in the Lua Manual)。

您引用的都是“按值传递”类型,因此它们直接存储在变量中。 如果你删除变量,值会立即消失。

所以它不会开始泄漏内存,当然,除非您不断生成包含新值的新变量。但在那种情况下,这是你自己的错;)。

【讨论】:

    【解决方案2】:

    在您链接到的文章中,他们写下了显示值如何表示的 C 代码:

    /*You can also find this in lobject.h in the Lua source*/
    /*I paraphrased a bit to remove some macro magic*/
    
    /*unions in C store one of the values at a time*/
    union Value {
      GCObject *gc;    /* collectable objects */
      void *p;         /* light userdata */
      int b;           /* booleans */
      lua_CFunction f; /* light C functions */
      numfield         /* numbers */
    };
    
    typedef union Value Value;
    
    /*the _tt tagtells what kind of value is actually stored in the union*/
    struct lua_TObject {
      int _tt;
      Value value_;
    };
    

    正如您在此处看到的,布尔值和数字直接存储在 TObject 结构中。由于它们不是“堆分配”的,这意味着它们永远不会“泄漏”,因此垃圾收集它们是没有意义的。

    然而,一个有趣的事情是垃圾收集器不收集创建的对事物的 C 端事物(用户数据和 C C 函数)的引用。这些在 C 方面需要是 manually managed,但这是意料之中的,因为在这种情况下,您正在编写 C 而不是 Lua。

    【讨论】:

    • 完整的用户数据(在问题中被称为“重用户数据”)对象实际上是垃圾收集的。轻量级用户数据不是。
    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2013-12-03
    • 2011-01-26
    相关资源
    最近更新 更多