Lua:垃圾收集userdata
发布时间:2020-12-15 00:16:58 所属栏目:大数据 来源:网络整理
导读:假设以下情况: typedef struct rgb_t {float r,g,b} rbg_t;// a function for allocating the rgb structrgb_t* rgb(r,b) { rgb_t* c = malloc(sizeof(rgb_t)); c-r=r; c-g=g; c-b=b; return c;}// expose rgb creation to luaint L_rgb (lua_State* L) { r
假设以下情况:
typedef struct rgb_t {float r,g,b} rbg_t; // a function for allocating the rgb struct rgb_t* rgb(r,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),3)); return 1; } 当从Lua调用L_rgb函数时,会发生两次分配. Lua分配新的userdata并为结构分配rgb构造函数.当变量超出Lua的范围时,userdata变量会发生什么?如果是垃圾收集结构的分配会发生什么? 解决方法
您有两种解决此问题的方法,两种方法都适用于您的具体情况.其他情况会让你更强烈地选择一个而不是另一个.
>您可以像在示例中那样执行操作,并使用malloc()获取私有数据块,并在完整的用户数据中存储指向它的指针.如果执行此操作,则必须在userdata上设置metatable,并在userdata收集垃圾时使用其__gc元方法释放已分配的块. 无论哪种方式,您都需要考虑错误处理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |