C Lua:垃圾收集&x2B;用户数据
假设出现以下情况:C Lua:垃圾收集&x2B;用户数据,c,memory,garbage-collection,lua,C,Memory,Garbage Collection,Lua,假设出现以下情况: typedef struct rgb_t {float r,g,b} rbg_t; // a function for allocating the rgb struct rgb_t* rgb(r,g,b) { rgb_t* c = malloc(sizeof(rgb_t)); c->r=r; c->g=g; c->b=b; return c; } // expose rgb creation to lua int L_rgb (lua_Sta
typedef struct rgb_t {float r,g,b} rbg_t;
// a function for allocating the rgb struct
rgb_t* rgb(r,g,b) {
rgb_t* c = malloc(sizeof(rgb_t));
c->r=r;
c->g=g;
c->b=b;
return c;
}
// expose rgb creation to lua
int L_rgb (lua_State* L) {
rgb_t** ud = (rgb_t **) lua_newuserdata(L, sizeof(rgb_t *));
*ud = rgb(lua_tonumber(L,1),lua_tonumber(L,2),lua_tonumber(L,3));
return 1;
}
从Lua调用L_rgb函数时,会发生两次分配。Lua分配新的userdata,rgb构造函数为struct分配。当userdata变量超出Lua中的作用域时,该变量会发生什么变化?如果是垃圾收集,结构的分配会发生什么情况?向用户数据添加一个元表,并将
\uu gc
键设置为释放函数。请参见对于这种情况,您有两种方法,两种方法都适用于您的具体情况。其他情况更强烈地驱使你选择其中一种
malloc()
获取私有数据块,并将指向它的指针存储在完整的userdata中。如果执行此操作,则必须在userdata上设置元表,并在userdata被垃圾收集时使用其\uu gc
元方法释放分配的块lua\u newuserdata()
代替malloc()
,可以将userdata本身用作私有数据块的分配。在这种情况下,您不需要有\uu gc
元方法,因为Lua将直接管理分配的生存期。您可能仍然希望有一个元表,以便可以使用其\u索引
项来创建名为r
、g
和b
的成员的外观,这些成员从结构中检索其值不管是哪种方式,您都需要考虑错误处理。方法#2将使您无需跟踪分配--在Lua错误和堆栈倒带时,Lua的GC仍将根据需要跟踪和释放代码块。您是否可以在此处提供帮助:?了解问题所在:?