Lua: сборка мусора + userdata - PullRequest
5 голосов
/ 26 августа 2010

Предположим следующую ситуацию:

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;
}

Когда функция L_rgb вызывается из Lua, происходит два выделения. Lua выделяет новые пользовательские данные, а функция конструктора rgb выделяет для структуры. Что происходит с переменной userdata, когда переменная выходит из области видимости в Lua? Если это сборка мусора, что происходит с распределением структуры?

Ответы [ 2 ]

12 голосов
/ 27 августа 2010

У вас есть два подхода к этой ситуации, и оба могут применяться к вашему конкретному случаю.Другие случаи побуждают вас выбирать один над другим.

  1. Вы можете делать то же, что и в своем примере, и использовать malloc(), чтобы получить свой личный блок данных и сохранитьуказатель на него в полных пользовательских данных.Если вы сделаете это, то вы должны установить метатабельность в пользовательских данных и использовать ее метаметод __gc, чтобы освободить выделенный блок, когда пользовательские данные будут собирать мусор.

  2. Вы можете использовать сами данные пользователя в качестве выделения для вашего личного блока данных, вызвав lua_newuserdata() вместо malloc().В этом случае вам не нужно иметь метаметод __gc, потому что Lua будет непосредственно управлять временем жизни выделения.Возможно, вы все еще захотите иметь метатаблицу, чтобы вы могли использовать ее запись __index для создания внешнего вида элементов с именами r, g и b, которые получают их значения из вашей структуры.

В любом случае, вам нужно подумать об обработке ошибок.

2 голосов
/ 26 августа 2010

добавить метатаблицу к вашим данным пользователя и установить ключ __gc для вашей функции освобожденияСм. документы

...