在Lua收集数字,bool或nils垃圾?

时间:2013-03-07 05:37:23

标签: memory-leaks garbage-collection lua

This article表示除了number,bools和nil之外的所有类型都是垃圾收集。

  

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

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

2 个答案:

答案 0 :(得分:2)

在Lua中,实际上有两种类型:总是按值传递的值和按引用传递的值(按照chapter 2.1 in the Lua Manual)。

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

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

答案 1 :(得分: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端创建的引用(userdata和C C函数)。这些东西需要来自C端的manually managed,但这是有待预期的,因为在这种情况下,你正在编写C而不是Lua。