Ho una perdita di memoria nella parte Lua della mia applicazione. Per qualsiasi motivo, il mio oggetto non viene cancellato quando dovrebbe (anche quando chiamo collectgarbage("collect")
). Presumo questo significa che ho un riferimento ciondolante da qualche parte.Trova tutti i riferimenti a un oggetto in Lua
Quindi, come posso ottenere un elenco di dove risiedono vari riferimenti a un oggetto? Per esempio:
obj = MyObject()
ref = obj
tbl = {obj}
obj = nil
print(getreferences(obj)) -- should print something like _G.ref, _G.tbl[1]
Vorrei semplicemente scrivere il mio propria funzione per questo, ma non sarebbe in grado di trovare i riferimenti contenuti all'interno di chiusure. Qualche consiglio?
Le tabelle e gli oggetti Lua non hanno nomi. Pertanto, tutto ciò che otterresti è un elenco di indirizzi di tabella, che non sarebbe molto utile. –
@Nicol Bolas: Non è completamente vero. Se dovessi iniziare con il toplevel, _G e usare le coppie (_G) per scendere fino a trovare una chiave il cui valore corrisponde a quello che sto cercando, mi verrà fornito il percorso completo per il riferimento. Semplicemente non so come accedere ai valori che risiedono nelle chiusure al di fuori della chiusura. – Ponkadoodle
E se il tavolo fosse un _key_? È un codice Lua interamente legale. Cosa succede se la chiave del tavolo non è una stringa? Cosa succede se non è nella tabella globale _at all_, che è anche del tutto possibile. Potrebbe trovarsi nel registro o potrebbe trovarsi nell'ambiente locale di una funzione. Lua non richiede che tutti gli oggetti siano raggiungibili da '_G'. –