Lua用户数据gc

Lua用户数据gc,lua,garbage-collection,lua-userdata,Lua,Garbage Collection,Lua Userdata,一段LuaUserData是否可以保存对Lua对象的引用?(比如一张表,或者另一段用户数据?)。基本上,我想知道的是: 我可以这样创建一段用户数据吗?当gc运行时,用户数据可以说:“嘿!我持有对这些其他对象的引用,也标记它们。” 编辑:响应lhf: 假设我有: struct Vertex { double x, y, z; } struct Quaternion { double w, x, y, z; } 现在,我可以做: struct Foo { Vertex v; Qu

一段LuaUserData是否可以保存对Lua对象的引用?(比如一张表,或者另一段用户数据?)。基本上,我想知道的是:

我可以这样创建一段用户数据吗?当gc运行时,用户数据可以说:“嘿!我持有对这些其他对象的引用,也标记它们。”

编辑:响应lhf:

假设我有:

struct Vertex {
  double x, y, z;
}

struct Quaternion {
  double w, x, y, z;
}
现在,我可以做:

struct Foo {
  Vertex v;
  Quaternion q;
}
但假设我想要:

struct Bar {
  Vertex *v;
  Quaternion *q;
}
[也就是说,假设顶点和四元数都是非常大的用户数据块]


现在,假设我有一个Lua用户函数,它接受一个userdata顶点和一个userdata四元数,并创建一个userdata栏(我不想要userdata Foo,因为我想节省空间)——那么我需要某种方式使userdata顶点*/Quaternion*不被gc-ed。

我用Lua做任何事情已经有一段时间了。我认为,如果引用的数据是由lua机器创建的,那么它会自己清理它。否则,您必须等待C代码中的gc回调,然后自己释放内存

一段lua用户数据是否可能保留对lua对象的引用


否。用户数据不能保存指向另一个Lua对象的指针。如果要使用userdata使另一个Lua对象保持活动状态,则必须使用弱表。罗伯托的书作为一本书,似乎很复杂。你为什么要这样做?@lhf:上面的编辑有意义吗?现在是另一个问题了。简单的答案是不要混合使用两种内存管理方式:C中的显式内存管理和Lua中的自动内存管理。看诺曼的答案。这是一个不同的问题吗?重点是“Bar”现在需要说——嘿,我在lua堆中指向的这个顶点*/四元数*也需要标记。“强表”是在gc调用时检查键和值的表。弱表是如何与userdata结合的?你能解释更多吗?你把userdata和你试图保持活跃的Lua值一起放在表中。Roberto的书是在线的,并解释了这一切。为什么我要使用弱表而不是强表呢?因为当GC运行时,如果弱表是唯一的引用,您的用户数据将被收集,然后它将停止保持其他对象的活动。需要澄清的是:保持从userdata到“其他对象”的映射,映射密钥的存储能力较弱。