2013-03-31 2 views
1

J'ai un problème avec les fuites de mémoire. Dans ce programme simple:Fuites de mémoire C et OpenCV

#include <stdlib.h> 
#include <stdio.h> 
#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 

int main() { 
    CvMat *src; 
    src = cvLoadImageM("p1.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    cvSaveImage("p2.bmp", src, 0); 
    cvReleaseMat(&src); 
    return 0; 
} 

Selon valgrind, il y a 7 fuites:

==10478== HEAP SUMMARY: 
==10478==  in use at exit: 10,464 bytes in 7 blocks 
==10478== total heap usage: 154 allocs, 147 frees, 2,908,450 bytes allocated 
==10478== 
==10478== LEAK SUMMARY: 
==10478== definitely lost: 0 bytes in 0 blocks 
==10478== indirectly lost: 0 bytes in 0 blocks 
==10478==  possibly lost: 0 bytes in 0 blocks 
==10478== still reachable: 10,464 bytes in 7 blocks 
==10478==   suppressed: 0 bytes in 0 blocks 
==10478== Rerun with --leak-check=full to see details of leaked memory 
==10478== 
==10478== For counts of detected and suppressed errors, rerun with: -v 
==10478== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) 

Quelqu'un peut-il me dire comment correctement la mémoire libre? Merci pour votre conseil.

+8

Vous n'avez pas démontré que vous avez une fuite de mémoire, seulement que valgrind s'en plaint. Les bibliothèques complexes utilisent parfois des modèles d'allocation qui sont faussement rapportés comme des fuites par des outils tels que valgrind. (Exemple: inclure des pools d'allocation, ou ne pas exécuter les destructeurs à la sortie pour des raisons de performances.) Un moyen simple de tester si une fuite de mémoire est réelle ou non est d'envelopper tout le contenu de 'main()' (sauf déclaration 'return') dans une boucle infinie. Commencez le processus et observez-le en utilisant l'outil 'top' ou un outil équivalent: si sa mémoire croît sans limite, * alors * vous avez une fuite à portée de main. – user4815162342

Répondre

1

@ user4815162342 a probablement raison. Bien que je vous recommande de migrer vers le nouveau C++OpenCvcv::Mat à travers lequel la gestion de la mémoire est automatique.

-1

J'ai vu cette fuite plusieurs fois. Vérifiez les erreurs détaillées ci-dessus ce que vous avez envoyé. C'est probablement le pixman lib.