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仍将根据需要跟踪和释放代码块。您是否可以在此处提供帮助:?了解问题所在:?