Memory leaks Lua中是否收集数字、布尔值或零值垃圾?

Memory leaks Lua中是否收集数字、布尔值或零值垃圾?,memory-leaks,garbage-collection,lua,Memory Leaks,Garbage Collection,Lua,意味着除数字、布尔和nil之外的所有类型都是垃圾收集的 字段gc用于其他值(字符串、表、函数、重用户数据和线程),这些值都要进行垃圾收集 这是否意味着在某些情况下过度使用这些非gc类型可能会导致内存泄漏?在Lua中,实际上有两种类型:始终按值传递的类型和按引用传递的类型(根据) 您引用的都是“按值传递”类型,因此它们直接存储在变量中。 如果删除该变量,该值将立即消失 所以它不会开始泄漏内存,当然,除非您不断生成包含新值的新变量。但在这种情况下,这是你自己的错;) 在您链接到的文章中,他们写下了显

意味着除数字、布尔和nil之外的所有类型都是垃圾收集的

字段gc用于其他值(字符串、表、函数、重用户数据和线程),这些值都要进行垃圾收集


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

在Lua中,实际上有两种类型:始终按值传递的类型和按引用传递的类型(根据)

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


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

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

/*您也可以在Lua源代码的lobject.h中找到它*/
/*我解释了一下,去掉了一些宏魔法*/
/*C中的联合每次存储一个值*/
联合价值{
GCObject*gc;/*可收集对象*/
void*p;/*light用户数据*/
int b;/*布尔*/
lua_C函数f;/*灯光C函数*/
numfield/*数字*/
};
typedef并集值;
/*_tt标记表示实际存储在联合体中的值的类型*/
结构lua_TObject{
国际贸易;
价值观;
};
正如您在这里看到的,布尔值和数字直接存储在TObject结构中。由于它们不是“堆分配的”,这意味着它们永远不会“泄漏”,因此垃圾收集它们是没有意义的


然而,值得注意的一点是,垃圾收集器不收集在对象(userdata和C函数)的C端创建的对象引用。这些需要来自C端,但这是意料之中的事情,因为在这种情况下,您编写的是C而不是Lua。

普通Lua是安全的,无论Lua代码中使用什么数据类型,内存泄漏都是不可能的。只有C端的错误代码才可能导致内存泄漏。完整的userdata(在问题中引用为“heavy userdata”)对象实际上是垃圾收集的。Light userdata不是。