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

C Discussion :

Fuite de mémoire lors d'un free


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur vision
    Inscrit en
    Janvier 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur vision
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 23
    Points : 29
    Points
    29
    Par défaut Fuite de mémoire lors d'un free
    Bonjour à tous,

    Après différentes lectures d'articles, messages de forum, etc. je me permets d'écrire ce message pour avoir un peu d'aide (je travaille dessus depuis trois jours sans savoir où vient le problème... !).

    Je fais du traitement d'image, et je travaille sur une fonction d'étiquetage. J'ai en entré une image 8bits, nommée TS, et une image 16 en sortie, nommé TD.
    Je fais un premier parcours de mon image 8 bits, TS donc, et je remplis un tableau de int* que je créé grâce à un malloc, pour gérer la fusion ou non d'objet (que je peux interpréter comme différents alors que non).

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
            int TfusionSize = min ( USHRT_MAX, 8 +(width*height)/8);
    	int* Tfusion = (int*)malloc(TfusionSize * sizeof(int));
    	if(Tfusion == NULL) return GIPS_ERR_ALLOC;
    	memset(Tfusion,0,sizeof(int) * TfusionSize );
     
    	Tfusion[0]=0;
    	Tfusion[1]=1;
     
    	int NextLabel = 1;
     
    	TD[0][0] = NextLabel;
    	Tfusion[NextLabel] = NextLabel;
    	if (NextLabel < TfusionSize)NextLabel++;
     
    		for(x=1; x<width; x++) {
    			if (TS[0][x] == TS[0][x-1]) {
    				TD[0][x] = TD[0][x-1];
    			} else {
    				TD[0][x] = NextLabel;
    				Tfusion[NextLabel] = NextLabel;
    				if (NextLabel < (TfusionSize - 2)) NextLabel++;
    			}
    		}
    		for(y=1; y<height; y++)
    		{
    			if (TS[y][0] == TS[y-1][0]) {
    				TD[y][0] = TD[y-1][0];
    			} else {
    				TD[y][0] = NextLabel;
    				Tfusion[NextLabel] = NextLabel;
    				if (NextLabel < (TfusionSize - 2)) NextLabel++;
    			}
     
    			for(x=1; x<width; x++)
    			{
     
    				int p1 = TD[y][x-1];
    				int p2 = TD[y-1][x];
     
    				if (TS[y][x] == TS[y][x-1] ) {
    					if ((p1 != p2)&&(TS[y][x-1]==TS[y-1][x])) {
    						while (Tfusion[p1]!=p1){
    							p1 = Tfusion[p1];
    						}
    						while (Tfusion[p2]!=p2){
    							p2 = Tfusion[p2];
    						}
    						if (p2>p1){
    							TD[y][x] = Tfusion[p2] = p1;
    						} else {
    							TD[y][x] = Tfusion[p1] = p2;
    						}
    					} else { 
    						TD[y][x] = TD[y][x-1];
    					}
    				} else if (TS[y][x] == TS[y-1][x] ) {
    					if ((p1 != p2)&&(TS[y][x-1]==TS[y-1][x])) {
    						while (Tfusion[p1]!=p1){
    							p1 = Tfusion[p1];
    						}
    						while (Tfusion[p2]!=p2){
    							p2 = Tfusion[p2];
    						}
    						if (p2>p1){
    							TD[y][x] = Tfusion[p2] = p1;
    						} else {
    							TD[y][x] = Tfusion[p1] = p2;
    						}
    					} 
    					else { 
    						TD[y][x] = TD[y-1][x];
    					}
    				} 
    				else {
    					TD[y][x] = NextLabel;
    					Tfusion[NextLabel] = NextLabel;
    					if (NextLabel < TfusionSize-2 ) NextLabel++;
    					else{
    						NextLabel = TfusionSize ;
    					}
    				}
    			}	
    		}
    	if (NextLabel>=TfusionSize) {
    		free(Tfusion);
    		return GIPS_ERR_OUT_OF_BOUND;
    	}
    j'ai un problème lors du free(Tfusion). Visual m'annonce une corruption de tas ("Head Corruption detected" est le message).

    J'ai essayé de créer mon tableau avec new, et donc de le supprimer avec delete... Ne fonctionne pas non plus. Je pense que je dois effacer une zone mémoire en dehors de mon pointeur Tfusion, mais je ne suis pas sûr de moi, et surtout je ne sais pas comment régler le problème...

    Quelqu'un aurait-il une idée pour m'aider ?

    Merci d'avoir pris le temps de lire ce message.

    Bien à vous,

    Foxaltex

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Regarde la ligne 14. L'indentation de ton code ne correspond pas à sa véritable logique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Avatar de ChipsAlaMenthe
    Homme Profil pro
    Ingénieur en eau chaude et ballon rond
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur en eau chaude et ballon rond
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Points : 394
    Points
    394
    Par défaut
    Je ne sais pas si tu utilises les outils de débbugage et de vérification mémoire, mais c'est réellement utile. Ca m'a aidé de nombreuses fois à trouver les problèmes de mémoire.

    Tu as Valgrind qui te permet justement de trouver d'où vient tes fuites mémoires, et ça c'est vraiment efficace.
    Et puis tu as ddd (version graphique de gdb) qui te permet d'afficher graphiquement tes cellules.

    Grâce à ce traçage j'ai pu jusqu'à aujourd'hui trouver toutes mes erreures de mémoire! ^^

Discussions similaires

  1. fuite de mémoire ?
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 16h19
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h18
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 10h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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