IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Fuite mémoire, comment bien désallouer ?


Sujet :

OpenCV

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut Fuite mémoire, comment bien désallouer ?
    Salut,
    je souhaiterais savoir comment vous désallouez vos structures car je me suis aperçu d'une fuite mémoire dans mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IplImage* img       => cvReleaseImage(&img)
    CvSeq* contour      => cvReleaseMemStorage(&(contour->storage))
    IplConvKernel* rect => cvReleaseStructuringElement(&rect)
    CvMat* mat          => cvReleaseMat(&mat);
    Voila comment je les utilise est-ce que je me trompe ?
    Quand faut-il utiliser cvFree ? à quoi sert-il ?

    Vaut-il mieux utiliser chaque cvRelease spécifique (cvReleaseImage, cvReleasememStorage,...) où toujours utiliser : cvRelease((void**)pointeur) ???

    Merci de vos conseils a+

  2. #2
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Le cvRealeaseImage est parfait...fais attention à bien tous les supprimer. Le reste je ne sais pas...

  3. #3
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    Es tu bien sur que la fuite memoire viennent d'un élément d'openCv? (pas d'utilisation de tableaux ou d'objets non detruits par exemple)
    Sinon le cvRelease dedié est en général bien suffisant
    =>
    OpenCv Addict

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    non justement je ne suis pas sur du tout que ca vienne de OpenCV (j'utilise dans une classe des tableau à trois dimensions alors je me perd un peu pour libérer ensuite l'espace...) mais je voulais déjà savoir si du côté de OpenCV je pouvais être sûr de n'avoir rien raté (je pense que c'est le cas).
    Je vais devoir éplucher les tableaux C++ alors
    Vous avez une technique efficace pour libérer un tableau qui a été initialisé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    double*** data;
    data = new double**[nbData];
    for(int i=0; i<nbData; i++) {
    	data[i] = new double*[heightResult];
    	for(int j=0; j<heightResult; j++) {
    		data[i][j] = new double[widthResult];
    		for(int k=0; k<widthResult; k++) {
    			data[i][j][k] = val; 
    		}
    	}
    }
    Merci!!!

  5. #5
    Membre actif Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Points : 207
    Points
    207
    Par défaut
    delete data ;
    delete [] data;
    delete [][] data;
    =>
    OpenCv Addict

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    merci de ta réponse en effet je ne faisait pas comme ca, ca vient surement de la...
    par contre j'ai une erreur de compilation lorsque je fait :
    cette notation existe t-elle ???

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    j'ai finalement trouvé mieux, ca règle ce problème de fuite mémoire mais il m'en reste encore un peu (l'utilisation mémoire monte mais bien moins vite) il doit en rester quelque part, voici comment détruire un tableau à 3dimensions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for(int k=0; k<dim1; k++) {
    	for(int j=0; j<dim2; j++) {
    		delete[] data[k][j];
    	}
    	delete[] data[k];
    }
    delete[] data;
    et voila, merci des conseils.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Moi je sais que j'avais des fuites de mémoire du l'utilisation d'une séquence déclaré en global, je ne pouvais release mon MenStorage. Et j'ai donc du coup utilisé "cvClearSeq". Tu as peut le mettre même genre de fuite ...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par k3ops Voir le message
    j'ai finalement trouvé mieux, ca règle ce problème de fuite mémoire mais il m'en reste encore un peu (l'utilisation mémoire monte mais bien moins vite) il doit en rester quelque part, voici comment détruire un tableau à 3dimensions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for(int k=0; k<dim1; k++) {
    	for(int j=0; j<dim2; j++) {
    		delete[] data[k][j];
    	}
    	delete[] data[k];
    }
    delete[] data;
    et voila, merci des conseils.
    Et pourquoi ne pas utilisé des vector ??? C'est plus simple d'utilisation.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    ben en fait je trouve ca plus compliqué par vecteurs pour accéder à une valeur précise, d'autant plus que un vecteur c'est bien pour ajouter des éléments mais pour y accéder le temps d'accès est décuplé (je perds plus de 5sec par exécution !!!)
    Un vecteur à t-il besoin d'être détruit si c'est une vecteur d'entier par exemple ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 44
    Points
    44
    Par défaut
    en fait j'avais fais une mauvaise manip et avec le vector c'est aussi rapide et je suis sur de bien le détruire avec ~vector() donc je vais garder cette solution, merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/05/2011, 13h42
  2. Réponses: 3
    Dernier message: 06/09/2010, 18h26
  3. comment détecter les fuites mémoires
    Par cyrille37 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 26/04/2008, 15h12
  4. Fuites mémoires : comment trouver
    Par stof dans le forum Visual C++
    Réponses: 16
    Dernier message: 29/02/2008, 10h58
  5. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo