假设出现以下情况:
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的作用域时,该变量会发生什么情况?如果它是垃圾回收的,结构的分配会发生什么?
发布于 2010-08-27 05:33:36
对于这种情况,您有两种方法,并且这两种方法都适用于您的特定情况。其他情况下,你会更强烈地选择其中一个。
malloc()获取您的私有数据块,并将指向它的指针存储在完整的userdata中。如果这样做,那么您必须在用户数据上设置一个元表,并在用户数据被垃圾收集时使用其__gc元方法来释放分配的块。lua_newuserdata()而不是malloc()。在这种情况下,您不需要拥有__gc元方法,因为Lua将直接管理分配的生命周期。您可能仍然希望拥有一个元表,以便可以使用其__index条目来创建名为r、g和b的成员的外观,这些成员从结构中检索它们的值。无论哪种方式,您都需要考虑错误处理。
发布于 2010-08-27 02:53:04
向用户数据添加一个元表,并将__gc键设置为释放函数。请参阅the docs
https://stackoverflow.com/questions/3578401
复制相似问题