2011-08-23 20 views
5

Uygulamamın Lua bölümünde bir bellek sızıntısı var. Her ne sebeple olursa olsun, nesneyim silinmiyor (collectgarbage("collect")'u aradığımda bile). Bunun bir yerde sarkan bir referansım olduğu anlamına gelir.Lua'da bir nesneye ait tüm referansları bul

Nesneye çeşitli referansların bulunduğu bir listeyi nasıl edinebilirim? Örneğin:

obj = MyObject() 
ref = obj 
tbl = {obj} 
obj = nil 
print(getreferences(obj)) -- should print something like _G.ref, _G.tbl[1] 

Ben sadece bunun için kendi işlevi yazardı ama kapanışları içinde bulunan referanslar bulmak mümkün olmaz. Herhangi bir tavsiye?

+0

Lua tabloları ve nesnelerinin adları yoktur. Bu nedenle, tek yapmanız gereken çok yararlı olmayacak olan masa adreslerinin bir listesidir. –

+0

@Nicol Bolas: Bu tamamen doğru değil. En üst seviyeden başlayacak olsaydım, _G ve çiftleri (_G), aradığım şeyi eşleştirdiğim bir anahtar bulana kadar yolumun üzerinde çalışacak olsaydım, referansın tam yolunu alırdım. Kapağın dışından gelen kapaklarda bulunan değerlere nasıl erişileceğini bilmiyorum. – Ponkadoodle

+1

Peki ya masa bir _key_? Bu tamamen yasal Lua kodu. Tablodaki anahtar bir dizge değilse ne olur? Ya da tümüyle mümkün olan global tabloda değil. Kayıt defterinde olabilir veya bir fonksiyonun yerel ortamında olabilir. Lua, tüm nesnelerin '_G''den erişilebilir olmasını gerektirmez. –

cevap

3

Tüm Lua evrenini geçmek için bir araç var. Bkz. http://lua-users.org/lists/lua-l/2006-07/msg00110.html

+0

Soruma bakın http://stackoverflow.com/questions/14531901/is-my-lua-object-being-collected . Bu komut dosyasının bir nesneye tüm referansları bulamayacağına inanıyorum. En azından benim için böyle yapmadı. Dikkatli kullanın. – Watusimoto

İlgili konular