Problème de release mémoire
Greensource
Membre
Bonjour bonjour!
J'ai un problème de mémoire, (dans mon programme bande de pti rigolo!)
C'est un projet sur iPhone mais ce sont des classes communes donc je préfère mettre ça ici.
Donc, j'ai constater avec Instruments qu'une grosse quantité de mémoire était alloué mais beaucoup trop peu était libéré, je vous joint le graphique éloquent.
Donc Instruments me dit que ce sont des NSData qui ce créer sans ce barrer >:(
Le code incriminé est le suivant:
la variable source, étant de type IplImage*, c'est un type venant de la bibliothèque OpenCV qui fait du traitement d'image.
Mon premier réflexe, Build&Analyse n'a rien donné et après relecture je voit vraiment pas c'est quoi son problème, selon la norme de codage c'est bien un objet autoreleasé qui m'est rendu ici donc je voit pas ce qui cloche ???
Quelqu'un à une idée?
ps: Pour info ce code est exécuté dans un thread séparé
ps2: Je vous joint aussi le code de toute la fonction mais idem je l'ai relu plusieurs fois je vois pas d'où ça viens
J'ai un problème de mémoire, (dans mon programme bande de pti rigolo!)
C'est un projet sur iPhone mais ce sont des classes communes donc je préfère mettre ça ici.
Donc, j'ai constater avec Instruments qu'une grosse quantité de mémoire était alloué mais beaucoup trop peu était libéré, je vous joint le graphique éloquent.
Donc Instruments me dit que ce sont des NSData qui ce créer sans ce barrer >:(
Le code incriminé est le suivant:
NSData *data = [NSData dataWithBytes:source->imageData length:source->imageSize];
la variable source, étant de type IplImage*, c'est un type venant de la bibliothèque OpenCV qui fait du traitement d'image.
Mon premier réflexe, Build&Analyse n'a rien donné et après relecture je voit vraiment pas c'est quoi son problème, selon la norme de codage c'est bien un objet autoreleasé qui m'est rendu ici donc je voit pas ce qui cloche ???
Quelqu'un à une idée?
ps: Pour info ce code est exécuté dans un thread séparé
ps2: Je vous joint aussi le code de toute la fonction mais idem je l'ai relu plusieurs fois je vois pas d'où ça viens
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ca veut dire que ce n'est pas de ma fautes? Je précise que ça n'est pas lié à mon problème initial, j'ai trouvé cette leak ailleurs dans le code.
D'ailleurs je constate quelques choses d'étrange, l'outils Leaks ne m'indique pas de fuite mémoire dans la fonction qui pose problème, on dirais plutôt qu'il n'a pas le temps de libéré la mémoire...
Je précise aussi que la méthode incriminé va être à appelé à la suite d'une callback utilisé par le capteur vidéo pour signaler l'arrivé d'une nouvelle image.
Or comme la callback n'est pas appelé en continu pour moi il y a forcément un moment ou le système peut relâcher la mémoire. Donc je ne comprend pas.
Juste une question... ta "structure" OpenCV IplImage, ou plus exactement la mémoire qui est utilisée par OpenCV, elle est bien libérée quelque part ?
Oui, c'est systématique à chaque nouvelle itération de la boucle de messages. Maintenant, effectivement, si ton NSOperation consiste en une boucle, il serait sans doute opportun d'avoir ton propre NSAutoreleasePool dans cette boucle, avec un drainage à chaque itération...
Pour être plus précis je créer une nouvelle NSOperation, uniquement si ma NSOperationQueue est vide && que je reçoit une nouvelle image.
J'ai quand même essayer sans trop y croire d'ajouter un NSAutoreleasePool dans la zone incriminé mais ça n'a pas fonctionné.
Quand je run avec Instruments je vois un malloc 508KB qui se met à augmenter sans qu'il redescende, donc à priori c'est lui qui pose problème (cf: screen1)
Ensuite quand je regarde ce que c'est que ce malloc 508KB je vois que ça viens de la méthode uiImageFromIplImage (cf:screen2)
Et ce qui est à l'origine du souci serait un NSData (cf:screen2)
Donc je ne suis pas sur car je ne maitrise pas très bien Instruments, mais ça semble venir de la quand même. D'autant que quand je met le NSData à nil, je n'ai plus ce souci.
@zoc pourtant l'UIImage que je créer est en autorelease, tout comme le NSData de toute façon. Mais ouais c'est peut-être ça aussi
C'est vraiment bizarre cette affaire.
tu n'aurais pas une directive de debug activée ? type nszombie ou bien une directive d'environnement (Malloc*) ? Ces directives peuvent conserver la mémoire desallouée un certain temp.
Manu
Je pense pour ça aussi. Ton NSData reçoit des retain quand tu le transmets via les différentes API que tu utilises pour créer le UIImage.
Ensuite le UIImage doit recevoir un retain en dehors de la fonction.
L'allocation est bien dans la fonction mais le problème vient surement d'un retain en dehors de la fonction que tu n'a pas identifié.
Ce qui est quand même bizarre c'est que tu n'a pas de leaks sur ton UIImage mais uniquement sur les données de l'image.
Est-ce que tu utilises la propriété CGImage de l'objet UIImage par la suite ?
donc normalement pas de souci de retain en trop, je vais aller checké les retain count.