This article表示除了number,bools和nil之外的所有类型都是垃圾收集。
字段gc用于其他值(字符串,表,函数,重用户数据和线程),这些值是垃圾回收的。
这是否意味着在某些情况下过度使用这些非gc类型可能会导致内存泄漏?
答案 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。