本文暗示除数字、布尔值和 nil 之外的所有类型都被垃圾回收。
字段 gc 用于其他值(字符串、表、函数、重用户数据和线程),这些值是垃圾回收的对象。
这是否意味着在某些情况下过度使用这些非 gc 类型可能会导致内存泄漏?
本文暗示除数字、布尔值和 nil 之外的所有类型都被垃圾回收。
字段 gc 用于其他值(字符串、表、函数、重用户数据和线程),这些值是垃圾回收的对象。
这是否意味着在某些情况下过度使用这些非 gc 类型可能会导致内存泄漏?
在 Lua 中,实际上有 2 种类型:始终按值传递的类型和按引用传递的类型(根据Lua 手册中的第 2.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。