2009-12-17 5 views
3

Avoir un problème avec les objets, pas plus besoin mais ayant toujours des références. Résultat: la taille de la mémoire allouée augmente constamment en raison d'objets non collectés.Références perdues dans Lua

Comment résoudre ce genre de problème? Existe-t-il un moyen de trouver des objets avec une seule référence, ou des objets dont la durée de vie est supérieure à une certaine valeur? Ou toute autre solution? Utilisation de Lua 5.1 et C++ avec luabind

Merci.

+1

êtes-vous par une tenue de hasard ou fuite instances luabind :: objet? – sbk

+0

Peut-être garder. Pas de fuite, car toutes les instances de luabind :: object sont créées dans la pile et il n'y a pas de telles fuites dans le code C++. – kFk

Répondre

1

Je ne suis pas certain de l'intégrer avec C++, mais il semble que le garbage collector n'ait pas la possibilité de s'exécuter.

Dans votre lua vous pourriez essayer explicitement de l'invoquer et de voir si cela aide. Il y a une fonction dans le noyau apis collectgarbage(opt [, arg]).

+0

La collecte des ordures fonctionne périodiquement et fait bien son travail. Mais il ne collecte pas d'objets avec des références existantes. Il y a beaucoup de tels objets et je ne peux pas les trouver. – kFk

+0

Souffrez-vous de problèmes de référence circulaire? –

+0

Lua résout-il correctement les références circulaires? Si non, c'est peut-être la raison. – kFk

5

Comme quelqu'un mentionne ici, vous pouvez essayer d'utiliser weak tables.

Si vous avez un code comme ceci:

myListOfObjects = {} 
... 
table.insert(myListOfObject, anObject) 

Puis, une fois anObject cesse utilisé, il ne sera jamais désalloué depuis myListOfObjects références encore.

Vous pouvez essayer de supprimer la référence en myListOfObjects (réglage de la référence à zéro), mais une solution plus simple est de déclarer myListOfObjects comme une table faible :

myListOfObjects = {} 
setmetatable(myListOfObjects, { __mode = 'v' }) --myListOfObjects is now weak 

Étant donné que setmetatable renvoie une référence à la table, il modifie, vous pouvez utiliser cet idiome plus court, ce qui fait la même chose que deux lignes précédentes:

myListOfObjects = setmetatable({}, {__mode = 'v' }) --creation of a weak table 
+0

Les tables faibles sont un bon mécanisme, mais comment trouver les objets appropriés à utiliser dans les tables faibles? Il y a environ 2 Mo de code lua dans le projet et il est problématique de trouver quels objets ne sont pas libérés et ont toujours une référence. La transformation de toutes les tables en tables faibles entraînera la destruction prématurée des objets. De plus, les tables sont principalement utilisées pour prendre en charge des objets et pour les libérer uniquement lorsque cela est nécessaire. Le problème est que toutes les références ne sont pas publiées et je ne peux pas les trouver. – kFk

+0

Si vous n'êtes pas sûr de ce que les tables devraient être faibles, alors votre seule façon de travailler est de mettre toutes les références à zéro quand elles cessent d'être utiles. Je vous recommande d'implémenter une méthode "destructeur" pour toutes vos "classes" (types de tables).Cette méthode destructeur devrait être appelée sur des objets qui ne sont plus nécessaires, et devrait égaler leurs références à zéro. En outre, pour "liste d'objets", implémentez une méthode "liberate" qui affecte nil aux références. – kikito