2011-08-23 11 views
5

Tengo una pérdida de memoria en la parte Lua de mi aplicación. Por alguna razón, mi objeto no se elimina cuando debería (incluso cuando llamo al collectgarbage("collect")). Supongo que esto significa que tengo una referencia colgante en alguna parte.Buscar todas las referencias a un objeto en Lua

Entonces, ¿cómo puedo obtener una lista de dónde residen varias referencias a un objeto? Por ejemplo:

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

yo simplemente escribo mi propia función para esto, pero no sería capaz de encontrar referencias contenidas en el interior de los cierres. ¿Algún consejo?

+0

Las tablas y los objetos de Lua no tienen nombres. Por lo tanto, todo lo que obtendrías es una lista de direcciones de tabla, que no sería muy útil. –

+0

@Nicol Bolas: Eso no es completamente cierto. Si tuviera que comenzar en el nivel superior, _G y usar pares (_G) para avanzar hasta encontrar una clave cuyo valor coincida con lo que estoy buscando, se me proporcionaría la ruta completa a la referencia. Simplemente no sé cómo acceder a los valores que residen dentro de cierres desde fuera del cierre. – Ponkadoodle

+1

¿Y si la tabla es una _key_? Eso es un código Lua completamente legal. ¿Qué pasa si la clave de la tabla no es una cadena? ¿Y si no está en la tabla global _at all_?, Que también es completamente posible. Podría estar en el registro, o podría estar en el entorno local de una función. Lua no requiere que todos los objetos sean accesibles desde '_G'. –

Respuesta

3

Hay una herramienta para atravesar todo el universo de Lua. Ver http://lua-users.org/lists/lua-l/2006-07/msg00110.html

+0

Consulte mi pregunta aquí: http://stackoverflow.com/questions/14531901/is-my-lua-object-being-collected . Creo que este script no encontrará todas las referencias a un objeto. Al menos, no lo hizo para mí. Úselo con precaución. – Watusimoto

Cuestiones relacionadas