2011-08-23 13 views
5

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?

+0

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. –

+0

@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

+1

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'. –

risposta

3

C'è uno strumento per attraversare l'intero universo Lua. Vedi http://lua-users.org/lists/lua-l/2006-07/msg00110.html

+0

Vedere la mia domanda qui: http://stackoverflow.com/questions/14531901/is-my-lua-object-being-collected . Credo che questo script non troverà tutti i riferimenti a un oggetto. Almeno, non è stato così per me. Usalo con cautela. – Watusimoto

Problemi correlati