Pergunta

É possível que um pedaço de Lua userData mantenha referência a um objeto Lua? (Como uma tabela, ou outra peça de dados do usuário?). Basicamente, o que eu quero saber é:

Posso criar uma peça de dados do usuário de tal maneira que o GC for executado, os dados do usuário podem dizer: "Ei! Estou mantendo referências a esses outros objetos, marque -os também".

Editar: Respondendo ao LHF:

Suponha que eu tenho:

struct Vertex {
  double x, y, z;
}

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

Agora, eu posso fazer:

struct Foo {
  Vertex v;
  Quaternion q;
}

Mas suponha que eu queira:

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

isto é, suponha que o vértice e o quaternion sejam realmente grandes peças de usuários].

Agora, suponha que eu tenha uma função de usuário da Lua que pega um vértice do usuário e um quaternion do usuário e cria uma barra de dados do usuário (não quero um usuário do usuário, pois quero salvar o espaço) - então preciso de alguma forma para o UserData vértice*/quaternion* para não ser GC-ED.

Foi útil?

Solução

É possível que uma parte dos dados do usuário da Lua mantenha referência a um objeto Lua?

Não. Um usuário do usuário não pode segurar um ponteiro para outro objeto Lua. Se você quiser usar um Data UserData para manter outro objeto Lua vivo, você precisa fazer isso usando Tabelas fracas. Livro de Roberto como um Seção sobre como fazer isso.

Outras dicas

Faz um tempo desde que fiz qualquer coisa com Lua. Penso que, se os dados referenciados foram criados pela máquina Lua, eles o limparão. Caso contrário, você deve esperar o retorno de chamada do GC em seu código C e libertar a memória você mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top