首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua:垃圾回收+ userdata

Lua:垃圾回收+ userdata
EN

Stack Overflow用户
提问于 2010-08-27 02:43:36
回答 2查看 4.4K关注 0票数 5

假设出现以下情况:

代码语言:javascript
复制
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的作用域时,该变量会发生什么情况?如果它是垃圾回收的,结构的分配会发生什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-27 05:33:36

对于这种情况,您有两种方法,并且这两种方法都适用于您的特定情况。其他情况下,你会更强烈地选择其中一个。

  1. 您可以像在示例中一样,使用malloc()获取您的私有数据块,并将指向它的指针存储在完整的userdata中。如果这样做,那么您必须在用户数据上设置一个元表,并在用户数据被垃圾收集时使用其__gc元方法来释放分配的块。
  2. 您可以使用用户数据本身作为私有数据块的分配,方法是调用lua_newuserdata()而不是malloc()。在这种情况下,您不需要拥有__gc元方法,因为Lua将直接管理分配的生命周期。您可能仍然希望拥有一个元表,以便可以使用其__index条目来创建名为rgb的成员的外观,这些成员从结构中检索它们的值。

无论哪种方式,您都需要考虑错误处理。

票数 13
EN

Stack Overflow用户

发布于 2010-08-27 02:53:04

向用户数据添加一个元表,并将__gc键设置为释放函数。请参阅the docs

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3578401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档