Lua垃圾收集:重新分配的userdata会触发__gc元事件吗?

时间:2016-09-06 23:36:34

标签: c api memory lua garbage-collection

重新分配用户数据值时,即

a = lib.new()
a = b

ablib.new()的结果都是带有定义的__gc元事件的userdata,将为两个值调用垃圾收集器a(即lib.new()的返回值和b的值)?这似乎是一般Lua对象的情况:Garbage Collection Tutorial

其次,如果将a分配给ba=b)的值,那么垃圾收集器是否会在userdata值上调用两次? (是否复制或引用了用户数据?)

但是,目前还不清楚这是否适用于带有元表的userdata。对于我的特定应用程序,如果是userdata元事件的情况,我希望会收到seg错误。

1 个答案:

答案 0 :(得分:2)

你似乎误解了Lua中“变量”和“值”之间的区别。 “变量”只是某种价值的持有者。 “值”是实际数据。

这与C不同,其中变量是对象。在Lua中,变量只是对象的命名持有者。

a是“带有已定义的__gc元事件的userdata”是错误的。 a 所持有的值。有区别。

tables / userdata / functions的值是对table / userdata / function的引用。因此,将一个变量的内容分配给另一个变量只会传输参考。

垃圾收集元方法将完全发生在Lua参考手册中它将说明:当对象被垃圾收集时(或之后)。只有在您无法访问该对象时,如果您的代码无法访问该对象,这种情况才会发生。

如果您在a中有引用,则可以访问它。所以不会发生垃圾收集。