Lua userdata gc
-
27-09-2019 - |
Domanda
E 'possibile per un pezzo di Lua userdata di riferimento in possesso di un oggetto Lua? (Come un tavolo, o di un altro pezzo di userdata?). In sostanza, quello che voglio sapere è:
Posso creare un pezzo di userdata in modo tale taht quando viene eseguito gc, i dati degli utenti possono dire: "Ehi, ho in mano i riferimenti a questi altri oggetti, li segnano così"
EDIT: rispondere alle LHF:
Supponiamo che io sono:
struct Vertex {
double x, y, z;
}
struct Quaternion {
double w, x, y, z;
}
Ora, posso fare:
struct Foo {
Vertex v;
Quaternion q;
}
ma supponiamo invece che voglio:
struct Bar {
Vertex *v;
Quaternion *q;
}
[vale a dire. supponiamo Vertex & Quaternion sono veramente grossi pezzi di userdata].
Ora, supponiamo che io ho una funzione che prende un Lua userdata Vertex, e un userdata Quaternion, e crea un datiutente Bar (Non voglio un Foo userdata perché voglio risparmiare lo spazio) - allora necessità I in qualche modo per l'userdata Vertex * / * Quaternion di non essere gc-ed.
Soluzione
E 'possibile per un pezzo di dati degli utenti lua di riferimento in possesso di un oggetto lua?
No. A userdata non può tenere un puntatore ad un altro oggetto Lua. Se si desidera utilizzare un userdata per tenere in vita un altro oggetto Lua, è necessario farlo utilizzando tavoli deboli . Il libro di Roberto come href="http://www.lua.org/pil/17.html" rel="nofollow sezione su come farlo .
Altri suggerimenti
Conosci un po 'che ho fatto niente con lua. Penso che se i dati a cui fa riferimento è stato creato dalla macchina lua, allora sarà ripulirlo stessa. In caso contrario, è necessario attendere la richiamata gc nel codice C e liberare la memoria da soli.