2009-08-26 7 views
0

dans mon application, je suis en train de traiter une image YUV422 à partir d'une webcam. mais je reçois une énorme fuite de mémoire. ci-dessous vous pouvez voir un exemple de code simplifié de mon application. si je désactive la ligne "(m1 ..." dans la fonction, il n'y a pas de fuite. (mais les images ne sont pas en cours de traitement.) J'ai essayé les verrous, les piscines, etc mais rien n'a changé. au cacao donc tous ces crochets semblent drôles/effrayants pour moi ;-)
est-ce un problème avec l'utilisation de "char
"? dans mon ancienne application linux + C++ il n'y avait pas de problème. mais j'utilisais "unsigned char *", pas de fils, et je ne l'ai jamais vérifié les fuites ...- (void) processImage: (char *) image; --- char * provoque une fuite de mémoire?

global:

... 
char m [640*480]; 

"principale":

... 
[NSThread detachNewThreadSelector:@selector(processOutputBuffer) toTarget:self withObject:nil]; 
... 

function1:

- (void)processOutputBuffer { 
[NSThread setThreadPriority:0.4]; 
[lock lock]; 
... 
Ptr outputBufferBaseAddress = (Ptr)CVPixelBufferGetBaseAddress(outputBuffer); 
CVPixelBufferLockBaseAddress(outputBuffer, 0); 
[self yuv422_to_y8uv8:outputBufferBaseAddress m1:m]; 
... 
} 

fonction2:

- (void) yuv422_to_y8uv8:(char *)image m1:(char *)m1 { 
int x,y; 
for (y = 0; y < 480; y++) 
    for (x = 0; x < 640; x++) 
    { 
    *(m1 + (640 * y) + (x))=*(image + (640*2 * y) + (x*2)+1); 
    } 
} 

Répondre

0

si je désactive le « * (M1 ... » ligne dans la fonction, il n'y a pas de fuite.

Untrue. C'est juste une mission. Soit il n'y a pas de fuite de toute façon, ou n'est pas la cause de la fuite.

Vous pouvez utiliser des instruments pour rechercher des objets (les allocations de mémoire simples et objets Cocoa) qui se sont échappés, et pour diagnostiquer les fuites.

est un problème en utilisant "ch ar * "?

No. Les types ne causent pas de fuites. Une mauvaise gestion de la mémoire provoque des fuites.

dans mon ancienne application linux + C++ il n'y avait pas de problème. mais j'utilisais "unsigned char *", pas de threads, et je n'ai jamais vérifié les fuites ...

Il est possible que vous ayez introduit la fuite lors de l'ajout de threads, ou lors de l'ajout de code Cocoa. Il est également possible que la fuite soit toujours là et que vous ne l'ayez jamais vue auparavant. Ce n'est que lorsque vous trouvez le problème avec des instruments ou un autre outil que vous saurez à coup sûr.

Vous pouvez également essayer d'utiliser l'analyseur statique Clang. Il peut détecter certains modèles de code qui causent des fuites, entre autres choses.

+0

analyseur statique trouvé quelques problèmes, mais aucun avec les fuites; instruments (v1.5 de xcode v3.1) trouvé une énorme fuite (seulement quand cette ligne a été activée) mais ...... il a dit que CVObject prend 496 B (cela n'a pas de sens pour moi parce que ce particulier la ligne ne contient aucun CVObject (quel qu'il soit)) LeakedBlocks> XxXXXXXHistory> Catégorie = CVObject, EventType = malloc, taille = 496, ResponsibleLibrary = CoreVideo, ResponsiblCaller = CVObject :: alloc (.. long, ..const , ..long, ..long) ..... merci de vos suggestions ..... – ravyr

+0

496 octets n'est pas une "énorme fuite". Essayez de trier la liste par nombre net d'objets, puis recherchez les classes qui ne sont ni Cocoa ni Core Foundation. –

+1

merci pour votre réponse. ça m'a beaucoup aidé - j'ai enfin commencé à chercher dans la bonne direction en utilisant les bons outils ... #net n'a pas montré la fuite tout comme j'ai confondu la 496B avec la "fuite énorme" .. mais en observant un autre instrument Courir en cours d'exécution, j'ai remarqué qu'il y a "GeneralBlock-618496" avec un nombre de # net relativement faible, mais NetBytes géant - après 1 minute plus de 500Mo. ReponsibleCallers de ces instances sont: CVPixelBufferBacking :: initWithPixelBufferDescription (...) alors maintenant je sais que j'étais perdu, et je suppose que je suis de retour sur la bonne voie maintenant ;-) – ravyr

-1

Une réponse boiteuse ... Je sais. Mais au cas où aucune meilleure réponse ne vient à vous. Vous pouvez toujours mettre la fonction dans un fichier C et le rendre clair c.

Peut-être même agréable de voir si cela résout la fuite. Sinon, le problème se situe ailleurs.

+0

Je pourrais vouloir essayer cela, mais malheureusement je "dois" aller vers le cacao, pas obtenir "retour" à c/C++
mais ..... bien sûr ..... si rien ne aide, je Je vais essayer ça aussi. Merci. – ravyr

+0

alors .... il s'est avéré que je ne vais pas essayer cela, car la fuite était complètement ailleurs.de toute façon - merci pour votre temps et "bonne volonté" – ravyr