Lua userdata gc - PullRequest
       21

Lua userdata gc

2 голосов
/ 14 июня 2010

Возможно ли, чтобы часть пользовательских данных Lua содержала ссылку на объект Lua? (Как таблица или другой кусок userdata?). По сути, я хочу знать:

Могу ли я создать часть пользовательских данных таким образом, чтобы при запуске gc пользовательские данные могли сказать: «Эй! Я держу ссылки на эти другие объекты, отметьте их также».

РЕДАКТИРОВАТЬ: отвечая на LHF:

Предположим, у меня есть:

struct Vertex {
  double x, y, z;
}

struct Quaternion {
  double w, x, y, z;
}

Теперь я могу сделать:

struct Foo {
  Vertex v;
  Quaternion q;
}

но предположим, что вместо этого я хочу:

struct Bar {
  Vertex *v;
  Quaternion *q;
}

[т.е.. предположим, что Vertex & Quaternion - это действительно большие куски пользовательских данных.

Теперь предположим, что у меня есть пользовательская функция Lua, которая принимает вершины пользовательских данных и Quaternion пользовательских данных и создает панель пользовательских данных (я не хочу Foo пользовательских данных, поскольку хочу сэкономить место) - тогда мне нужно каким-то образом пользовательские данные Vertex * / Quaternion * не должны быть gc-ed.

Ответы [ 2 ]

4 голосов
/ 14 июня 2010

Возможно ли, чтобы пользовательские данные lua содержали ссылку на объект lua?

No. Пользовательские данные не могут содержать указательеще один объект Lua.Если вы хотите использовать пользовательские данные для поддержки другого объекта Lua, вы должны сделать это, используя слабые таблицы .Книга Роберто как раздел о том, как это сделать .

0 голосов
/ 14 июня 2010

Давненько я ничего не делал с Луей. Я думаю, что если данные, на которые ссылаются, были созданы машиной lua, то она сама их очистит. В противном случае вы должны дождаться обратного вызова gc в вашем коде C и освободить память самостоятельно.

...