c - Lua 垃圾回收 : Will reassigned userdata have its __gc meta event triggered?

标签 c api memory lua garbage-collection

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

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/

相关文章:

python - 使用pympler识别哪些变量在python中泄漏内存

node.js - 为现有 NodeJS 服务器生成 Swagger 文档

facebook - 外部访问 Facebook 事件

javascript - loopback Find() "where"子句未返回预期结果

在内存中复制一个函数并执行它

ruby - JSON的基于流的解析和写入

c - 'including *.c files' 风格的 C 编程中可能存在的缺陷

c - 头文件 2 需要头文件 1 中的结构,我该怎么做?

c - 如何在OpenCL中使用并行归约来实现求和?

c - 这段代码中的段错误?