Lua 用户数据 GC

Lua 中的 userdata 是否能够保存对一个 Lua 对象的引用?(比如一个 table,或另一个 userdata)。我的问题具体是:

我是否可以以某种方式创建 userdata,以便在 gc 运行时,userdata 可以说:“嘿!我持有对这些其他对象的引用,请将它们标记为不可回收。”

编辑:回复 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 和 Quaternion 是非常大的 userdata]。

现在,假设我有一个 Lua 用户函数,它需要一个 userdata Vertex 和一个 userdata Quaternion,并创建一个 userdata Bar(因为我想节省空间)- 然后我需要 userdata Vertex* /Quaternion* 不会被 gc 回收。

原文链接 https://stackoverflow.com/questions/3034247

点赞
stackoverflow用户184741
stackoverflow用户184741
很长时间没有使用lua了。我认为,如果所参考的数据是由lua机器创建的,那么它会自行清理。否则,您必须在C代码中等待gc回调并自行释放内存。
2010-06-13 23:20:35
stackoverflow用户41661
stackoverflow用户41661

不能。一个 userdata 不能持有另一个 Lua 对象的指针。如果你想使用 userdata 来保持另一个 Lua 对象的存活,你必须使用 弱表。Roberto 的书有一节 介绍如何使用弱表

2010-06-14 00:30:12