Lua userdata gc

时间:2010-06-13 23:10:58

标签: lua garbage-collection lua-userdata

一块Lua用户数据是否可以保存对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;
}

[即。假设Vertex&四元数是用户数据的重要组成部分]。

现在,假设我有一个Lua用户函数,它接受用户数据Vertex和用户数据Quaternion,并创建一个userdata Bar(我不想要userdata Foo,因为我想保存空间) - 然后我需要不知何故,用户数据Vertex * / Quaternion *不能被gc-ed。

2 个答案:

答案 0 :(得分:4)

  

一个lua用户数据是否可以保存对lua对象的引用?

否。用户数据无法保存指向另一个Lua对象的指针。如果要使用userdata使另一个Lua对象保持活动状态,则必须使用弱表来执行此操作。罗伯托的书作为section on how to do it

答案 1 :(得分:0)

因为我和lua做了什么,所以已经有一段时间了。我认为如果引用的数据是由lua机器创建的,那么它将自己清理它。否则,您必须等待C代码中的gc回调并自行释放内存。