重新分配用户数据值时,即
a = lib.new()
a = b
a
,b
和lib.new()
的结果都是带有定义的__gc
元事件的userdata,将为两个值调用垃圾收集器a(即lib.new()
的返回值和b
的值)?这似乎是一般Lua对象的情况:Garbage Collection Tutorial。
其次,如果将a
分配给b
(a=b
)的值,那么垃圾收集器是否会在userdata值上调用两次? (是否复制或引用了用户数据?)
但是,目前还不清楚这是否适用于带有元表的userdata。对于我的特定应用程序,如果是userdata元事件的情况,我希望会收到seg错误。
答案 0 :(得分:2)
你似乎误解了Lua中“变量”和“值”之间的区别。 “变量”只是某种价值的持有者。 “值”是实际数据。
这与C不同,其中变量是对象。在Lua中,变量只是对象的命名持有者。
说a
是“带有已定义的__gc元事件的userdata”是错误的。 a
所持有的值。有区别。
tables / userdata / functions的值是对table / userdata / function的引用。因此,将一个变量的内容分配给另一个变量只会传输参考。
垃圾收集元方法将完全发生在Lua参考手册中它将说明:当对象被垃圾收集时(或之后)。只有在您无法访问该对象时,如果您的代码无法访问该对象,这种情况才会发生。
如果您在a
中有引用,则可以访问它。所以不会发生垃圾收集。