代码之家  ›  专栏  ›  技术社区  ›  Nick Van Brunt

Lua:垃圾收集+用户数据

  •  5
  • Nick Van Brunt  · 技术社区  · 14 年前

    假设出现以下情况:

    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分配新的用户数据,rgb构造函数函数分配结构。当变量超出lua中的作用域时,userdata变量会发生什么?如果它是垃圾收集的,那么结构的分配会发生什么?

    2 回复  |  直到 14 年前
        1
  •  12
  •   RBerteig Keith Adler    14 年前

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

    1. 你可以像在你的样本中那样做,并使用 malloc() 获取私有数据块,并将指向它的指针存储在完整的用户数据中。如果这样做,则必须在用户数据上设置元表,并使用它 __gc 当用户数据被垃圾收集时,元方法释放分配的块。

    2. 通过调用 lua_newuserdata() 代替 马尔洛() . 在这种情况下,您不需要 γ-GC 元方法,因为Lua将直接管理分配的生存期。您可能仍然需要一个元表,以便使用它 __index 创建名为的成员外观的条目 r , g b 从结构中检索它们的值。

    不管怎样,您都需要考虑错误处理。

        2
  •  2
  •   Javier    14 年前

    向用户数据中添加元表,并设置 __gc 释放功能的键。见 the docs