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

SL & STL C++ Discussion :

[STL] Fuite mémoire et STL


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut [STL] Fuite mémoire et STL
    Bonjour,
    Je fais un petit programme ou j'utilisais les listes chainées. J'avais décider de tout gérer moi même, mais je me suis retrouve en difficulté. Comme mon implémentation de liste n'était pas top top ! Je me suis tourne vers la STL.
    Mais, alors que je n'avais pas de fuite de mémoire... maintenant j'en ai ! Mon problème est que M. Valgrind ne détecte aucune erreur... Et pourtant petit a petit la mémoire grimpe grimpe et mon prog en mange et en mange....
    Je me demande donc si je n'ai pas oublier quelques choses :
    Et voici le code en question :
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    	if((tabBin!=NULL)&&(tabSeg!=NULL)&&(tabVertices!=NULL)&&nbSeg>2)
    	{
    		list<Line*>::iterator iter;
    		list<Line*> workingSegments;
     
    		Line* addList[2];
    		Line* delList[2];
     
    		Line* seg;
    		int numWorkingSegments=0;
    		int iDelList=0;
    		int nbDelList=0;
    		cout<<"fillBin is running..."<<endl;
     
    		for(unsigned int iVertices=0;iVertices<nbSeg;iVertices++)
    		{
    			iDelList=INIT;
    			nbDelList=INIT;
    			Vertices* vCurrent=tabVertices[iVertices];
    			cout<<"..................."<<iVertices+1<<" Out of "<<nbSeg<<endl;
     
    			for(int init=0;init<2;init++)
    			{
    				addList[init]=NULL;
    				delList[init]=NULL;
    			}
     
    			for(unsigned int iSeg=0;iSeg<2;iSeg++)
    					addList[iSeg]=*(vCurrent->getSegments()+iSeg);
     
     
    			if(iVertices==0)
    			{
    				cout<<"Current Vertices : "<<vCurrent<<endl;
    				workingSegments.push_back(addList[0]);
    				addList[0]->setActivity(true);
    				workingSegments.push_back(addList[1]);
    				addList[1]->setActivity(true);
    				numWorkingSegments+=2;
    				cout<<"ajoute : "<<addList[0]<<endl;
    				cout<<"ajoute : "<<addList[1]<<endl;
    			}
     
     
    			if(iVertices>0)
    			{	
    				cout<<"Current Vertices : "<<vCurrent<<"and alpha = "<<vCurrent->getAngle()<<endl;	
    				for(iter=workingSegments.begin(); iter!= workingSegments.end(); ++iter)
    				{
    				 cout<<"Vertices : "<<(*iter)->getPtIni()<<" and "<<(*iter)->getPtFin()<<" belong to WorkingSegment : "<<(*iter)<<endl;
    					if(((*iter)->getPtIni()==vCurrent) || ((*iter)->getPtFin()==vCurrent))
    					{
    						if(nbDelList<2) // if(delList is not Full)
    						{cout<<(*iter)<<"** added to delList["<<nbDelList<<"]."<<endl<<endl;
    							delList[nbDelList]=(*iter);
    							nbDelList++;
    						}
    					}
    				}
     
    				for(int i=0;i<2;i++)
    				{
    					if(addList[i]->getActivity()==false) //if segment in addList is not in WorkingSegment list
    					{	
    						cout<<"ajoute : "<<addList[i]<<endl;
    						workingSegments.push_back(addList[i]);
    						numWorkingSegments++;
    						addList[i]->setActivity(true);
    					}
    				}
    			}
    			for(int i=0;i<2;i++)
    			{		
    				if(delList[i]!=NULL)
    				{
    					if(delList[i]->getActivity()==true) //if segment in delList is in the WorkingSegment list
    					{
    						workingSegments.remove(delList[i]);	
    						cout<<"retire : "<<delList[i]<<endl;
    						numWorkingSegments--;				
    					}
    				}
    			}
    			cout<<numWorkingSegments<<endl;
     
    			if(numWorkingSegments!=0)
    			{	
     
    				for(iter=workingSegments.begin(); iter!= workingSegments.end(); ++iter)
    					tabBin[iVertices].addSeg(*(iter));
    		//	sortSeg(tabBin[iVertices].getTabSeg(),numWorkingSegments);
    			}
    			else
    			{		cout<<"fin"<<endl;
    					tabBin[iVertices].addSeg(NULL);
    			}
    		}
    		cout<<"fillBin ended..."<<endl;
    	}
    }
    Bien sur tous les Segment* sont désalloués dans une autre fonction ! Je ne veux surtout pas les désallouer maintenant !

    Merci Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Où sont alloués et libérés les Line que tu références dans workingSegment ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    Les Lines sont créer au par avant dans une autre fonction.
    Je libère tout dans le main...

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    @spongebob: je ne sais pas si tu le sais, mais les méthodes erase() et remove() des vectors retirent juste les éléments du vecteur, ca ne les détruit pas. Donc tu dois faire un delete sur tes pointeurs. Regarde la FAQ si tu sais pas, c'est expliqué.

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete *it;
    it = v.erase(it);
    au lieu de

    Lorsqu'il s'agit de pointeurs bien évidemment.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    @coyotte507
    Citation Envoyé par SpongeBob
    Bien sur tous les Segment* sont desalloue dans une autre fonction ! Je ne veux surtout pas les desallouer maintenant !

    Merci Merci
    Je sais ça...merci... Je veux juste savoir si mon erreur est ici ou ailleurs ? s'il faut par exemple détruire l'itérateur ou détruire la liste créée.
    Merci encore

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    non faut pas les détruire, ils sont créés en statique. Peut être que l'erreur vient d'autre part?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 129
    Par défaut
    Citation Envoyé par coyotte507
    non faut pas les détruire, ils sont créés en statique. Peut être que l'erreur vient d'autre part?
    Et oui ça ne venait pas de là, ni d'une des fonctions de mon cpp principal.... Ça venait d'une petite boite à outil que j'ai développé à part
    Arf, je fais pas attention à toutes les versions différentes que j'ai....
    Merci quand même !

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

Discussions similaires

  1. Singleton et Fuite mémoire avec objet STL
    Par Robxley dans le forum C++
    Réponses: 7
    Dernier message: 09/02/2011, 11h01
  2. fuite mémoire stl
    Par christouf dans le forum SL & STL
    Réponses: 7
    Dernier message: 08/07/2008, 10h28
  3. Réponses: 8
    Dernier message: 09/02/2007, 15h31
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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