4

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

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

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

4

2 回答 2

2

在 Lua 中,实际上有 2 种类型:始终按值传递的类型和按引用传递的类型(根据Lua 手册中的第 2.1 章)。

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

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

于 2013-03-07T09:10:43.410 回答
1

在您链接到的文章中,他们写下了显示值如何表示的 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 端事物(用户数据和 CC 函数)的引用。这些需要从 C 端手动管理,但这是意料之中的,因为在这种情况下,您正在编写 C 而不是 Lua。

于 2013-03-07T15:46:51.487 回答