当用户数据值被重新分配时,即
a = lib.new()
a = b
在哪里a
, b
,以及 lib.new()
的结果都是定义了 __gc
的用户数据元事件,是否会为 a 的两个值(即 lib.new()
的返回值和 b
的值)调用垃圾收集器?这似乎是一般 Lua 对象的情况:Garbage Collection Tutorial .
其次,如果a
被分配给 b
的值( a=b
),垃圾收集器是否会在 userdata 值上被调用两次? (用户数据是复制还是引用?)
然而,尚不清楚这是否适用于具有元表的用户数据。对于我的特定应用程序,如果是用户数据元事件,我预计会收到段错误。
最佳答案
您似乎误解了 Lua 中“变量”和“值”之间的区别。 “变量”只是一些值的持有者。 “值”是实际数据。
这与 C 不同,在 C 中变量是一个对象。在 Lua 中,变量只是对象的命名持有者。
说 a
是“具有定义的 __gc 元事件的用户数据”是错误的。 a
持有的 值可以。有区别。
表/用户数据/函数的值是对表/用户数据/函数的引用。因此,将一个变量的内容分配给另一个变量只会转移引用。
垃圾收集元方法将在 Lua 引用手册中说它会发生:对象被垃圾收集时(或之后)。只有当您的代码无法再访问该对象时,当您无法访问对该对象的引用时,才会发生这种情况。
如果您在a
中有一个引用,那么您就可以访问它。因此不会发生垃圾回收。
关于c - Lua 垃圾回收 : Will reassigned userdata have its __gc meta event triggered?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39359257/