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

Langage C++ Discussion :

Fuite mémoire - Map/Vector


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut Fuite mémoire - Map/Vector
    Bonjour à tous,

    Je viens vous voir, vous les experts (enfin j'espère ) pour palier à mon problème de fuite mémoire.

    Je travaille sur un petit programme de gestion de "forme".

    J'ai donc 4 quatres classes.

    Cercle - permettant d'instancier un Cercle avec son rayon et centre
    Polygone - permettant d'instancier un Polygone par ces points contenu dans deux vector<double> x et y.

    Forme, classe abstraite et parente de Cercle et Polygone

    Usine permettant de stocker des formes (cercle, polygone) par le biais d'une map.


    Mon main me permet d'instancier un cercle ou un polygone et de mettre une copie de celui-ci dans l'usine.

    Pour un cercle, j'ai aucun soucis. Pour un polygone voici le code suivi :

    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
     
    string nomPolygone;
    int nombrePoints;
    vector<double> xPolygone, yPolygone;
    double xTmp, yTmp;
    Forme* tmp;
     
    cout << "Identifiant de votre Polygone ?" << endl;	
    cin >> nomPolygone;
    cout << "" << endl;
    cout << "Combien de points contiendra votre polygone ?" << endl;	
    cin >> nombrePoints;
    cout << "" << endl;
     
    for(i=0;i<nombrePoints;i++)
    {
    	cout << "Enregistrement N " << i+1 << " :" << endl;
    	cout << "--------------------" << endl;
     
    	cout << "X = ";
    	cin >> xTmp;						
    	cout << "Y = ";
    	cin >> yTmp;
    	xPolygone.push_back(xTmp);
    	yPolygone.push_back(yTmp);
    }
    tmp = new Polygone(xPolygone, yPolygone);
    test = U.ajouterForme(nomPolygone,tmp);
     
    if(test) cout << "Ajout réussi" << endl;
    else cout << "Ajout non réussi - la clé existe déjà" << endl;
     
    delete tmp;
    On va donc dans ajouterForme (const string&, Forme*);

    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
     
    bool Usine::ajouterForme(const string &_identifiant, Forme* obj)
    {
    	//Insertion de l'identifiant et de l'objet dans une pair et ensuite dans le catalogue
    	//Le pointeur de Forme ajouté dans l'usine correspond à une copie de celui passé en parametre
    	if(obj==0) 
    	{
    		return 0;
    	}	
    	else if(!catalogue.count(_identifiant)) 
    	{ 
    		catalogue.insert(pair<string, Forme*>(_identifiant,obj->dupliquer())); 
    		return 1; 
    	}
    	else
    	{
    		return 0;
    	}
    }
    On appelle donc dupliquer() (de polygone par polymorphisme)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Forme* Polygone::dupliquer() const
    {
    	return new Polygone(*this);
    }
    qui appelle le constructeur de recopie de polygone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Polygone::Polygone(const Polygone& obj)
    {
    	x = obj.x;
    	y = obj.y;
    	cout << "CREATION D'UN POLYGONE PAR RECOPIE" << endl;
    }
    Et la dans le constructeur de recopie, c'est le drame ! En testant j'ai vu que si je commentais les deux lignes de code sur les vecteurs, j'avais aucune fuite, avec ...

    valgrind me donne en rapport :

    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
     
    ==2513== 
    ==2513== HEAP SUMMARY:
    ==2513==     in use at exit: 192 bytes in 6 blocks
    ==2513==   total heap usage: 34 allocs, 28 frees, 706 bytes allocated
    ==2513== 
    ==2513== 32 bytes in 1 blocks are definitely lost in loss record 1 of 6
    ==2513==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==2513==    by 0x805418F: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void const*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8053DF9: std::_Vector_base<double, std::allocator<double> >::_M_allocate(unsigned int) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805707A: double* std::vector<double, std::allocator<double> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > > >(unsigned int, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056E3F: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x80566C7: Polygone::Polygone(std::vector<double, std::allocator<double> >, std::vector<double, std::allocator<double> >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8050D13: main (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513== 
    ==2513== 32 bytes in 1 blocks are definitely lost in loss record 2 of 6
    ==2513==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==2513==    by 0x805418F: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void const*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8053DF9: std::_Vector_base<double, std::allocator<double> >::_M_allocate(unsigned int) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805707A: double* std::vector<double, std::allocator<double> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > > >(unsigned int, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056E3F: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x80566DC: Polygone::Polygone(std::vector<double, std::allocator<double> >, std::vector<double, std::allocator<double> >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8050D13: main (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513== 
    ==2513== 32 bytes in 1 blocks are definitely lost in loss record 3 of 6
    ==2513==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==2513==    by 0x805418F: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void const*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8053DF9: std::_Vector_base<double, std::allocator<double> >::_M_allocate(unsigned int) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805707A: double* std::vector<double, std::allocator<double> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > > >(unsigned int, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056E3F: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056784: Polygone::Polygone(Polygone const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056D1A: Polygone::dupliquer() const (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8054A9C: Usine::ajouterForme(std::string const&, Forme*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8050DAB: main (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513== 
    ==2513== 32 bytes in 1 blocks are definitely lost in loss record 4 of 6
    ==2513==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==2513==    by 0x805418F: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void const*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8053DF9: std::_Vector_base<double, std::allocator<double> >::_M_allocate(unsigned int) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805707A: double* std::vector<double, std::allocator<double> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > > >(unsigned int, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056E3F: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805679C: Polygone::Polygone(Polygone const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056D1A: Polygone::dupliquer() const (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8054A9C: Usine::ajouterForme(std::string const&, Forme*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8050DAB: main (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513== 
    ==2513== 32 bytes in 1 blocks are definitely lost in loss record 5 of 6
    ==2513==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==2513==    by 0x805418F: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void const*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8053DF9: std::_Vector_base<double, std::allocator<double> >::_M_allocate(unsigned int) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805707A: double* std::vector<double, std::allocator<double> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > > >(unsigned int, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056E3F: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056784: Polygone::Polygone(Polygone const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056D1A: Polygone::dupliquer() const (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8054C11: Usine::creerForme(std::string const&) const (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805100D: main (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513== 
    ==2513== 32 bytes in 1 blocks are definitely lost in loss record 6 of 6
    ==2513==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
    ==2513==    by 0x805418F: __gnu_cxx::new_allocator<double>::allocate(unsigned int, void const*) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8053DF9: std::_Vector_base<double, std::allocator<double> >::_M_allocate(unsigned int) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805707A: double* std::vector<double, std::allocator<double> >::_M_allocate_and_copy<__gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > > >(unsigned int, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double const*, std::vector<double, std::allocator<double> > >) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056E3F: std::vector<double, std::allocator<double> >::operator=(std::vector<double, std::allocator<double> > const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805679C: Polygone::Polygone(Polygone const&) (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8056D1A: Polygone::dupliquer() const (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x8054C11: Usine::creerForme(std::string const&) const (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513==    by 0x805100D: main (in /home/jonathan/TPC++/TP6/V1.1/Formes)
    ==2513== 
    ==2513== LEAK SUMMARY:
    ==2513==    definitely lost: 192 bytes in 6 blocks
    ==2513==    indirectly lost: 0 bytes in 0 blocks
    ==2513==      possibly lost: 0 bytes in 0 blocks
    ==2513==    still reachable: 0 bytes in 0 blocks
    ==2513==         suppressed: 0 bytes in 0 blocks
    ==2513== 
    ==2513== For counts of detected and suppressed errors, rerun with: -v
    ==2513== ERROR SUMMARY: 6 errors from 6 contexts (suppressed: 17 from 6)
    Une idée ? (ou plus ...)

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    C'est difficile de savoir vu qu'on a pas tout ton code. Mais à mon avis c'est parce que tu ne libères pas la mémoire des vecteurs dans le destructeur de Polygon ?

    Vérifie partout que tu as déssalloué tout ce qu'il fallait et notamment les vecteurs dont tu parles.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    En effet, je ne désalloue jamais les vector<double>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Polygone::~Polygone()
    {
    	cout << "DESTRUCTION D'UN POLYGONE" << endl;
    }
    Il me semble que c'est automatique non ?

    J'ai essayé de faire des x.clear() et y.clear() dans polygone pour tester sans succes.

    Polygone.cpp
    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
     
    //Constructeur par défaut qui permet de créer un Polygone en définissant ses paramètres
    Polygone::Polygone(vector<double> _x, vector<double> _y)
    {	
    	x = _x;
    	y = _y;
    	cout << "CREATION D'UN POLYGONE" << endl;
    }
     
    //Constructeur de recopie qui permet de créer un Polygone à partir d'un autre Polygone
    Polygone::Polygone(const Polygone& obj)
    {
    	x = obj.x;
    	y = obj.y;
    	cout << "CREATION D'UN POLYGONE PAR RECOPIE" << endl;
    }
     
    //Destructeur de Polygone, les "vector" se supprime automatiquement par le biais du destructeur de la classe vector
    Polygone::~Polygone()
    {
    	cout << "DESTRUCTION D'UN POLYGONE" << endl;
    }
     
    //obtenirPerimetre permet de connaitre le périmètre du Polygone, le calcul est basé sur le principe que les points sont dans l'ordre (1,2,3, ...)
    double Polygone::obtenirPerimetre()const
    {
    	double perimetre=0;	
     
    	for(int i=0;i<x.size()-1;i++)
    	{
    		perimetre = perimetre + sqrt(pow(x.at(i+1)-x.at(i),2)+pow(y.at(i+1)-y.at(i),2));
    	}
     
    	return perimetre + sqrt(pow(x.at(x.size()-1)-x.at(0),2)+pow(y.at(y.size()-1)-y.at(0),2));
    }
     
    //deplacerForme permet de faire une translation pure à la Forme
    void Polygone::deplacerForme(double _xDeplacement, double _yDeplacement)
    {
    	for(int i=0;i<x.size();i++)
    	{
    		x[i] = x[i] + _xDeplacement;
    		y[i] = y[i] + _yDeplacement;
    	}
    }
     
    void Polygone::afficher()const
    {
     
    	cout << "|-----------------------------|" << endl;
    	cout << " Polygone    " << endl;
     
     
    	for(int i=0;i<x.size();i++)
    	{
    		cout << " Point " << i+1 << ":  x=" << x.at(i) << " , y=" << y.at(i) << endl;
    	}
    	cout << "" << endl;
    	cout << " Périmètre = " << obtenirPerimetre() << endl;
    	cout << "" << endl;
    	cout << "" << endl;
    	cout << "" << endl;
    	cout << "" << endl;
     
     
    }
     
    //dupliquer permet de retourner une copie du pointeur sur l'objet courant this.
    Forme* Polygone::dupliquer() const
    {
    	Forme* tmp = new Polygone(this->x, this->y);
    	return tmp;
    }
     
    #endif
    Usine.cpp
    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
     
    //Constructeur par défaut
    Usine::Usine()
    {
    	cout << "CREATION D'UNE USINE" << endl;
    }
     
    //Destructeur par défaut, celui-ci vide les formes de l'usine et supprime la map
    Usine::~Usine()
    {
    	map<string,Forme*>::iterator it;
     
    	for (it=catalogue.begin();it!=catalogue.end();it++)
    	{
    		delete (*it).second;
    	}
    	catalogue.clear();
    	cout << "DESTRUCTION D'UNE USINE" << endl;
    }	
     
    //ajouterForme permet d'ajouter une forme dans l'usine en se basant sur une forme et son identifiant
    bool Usine::ajouterForme(const string &_identifiant, Forme* obj)
    {
    	//Insertion de l'identifiant et de l'objet dans une pair et ensuite dans le catalogue
    	//Le pointeur de Forme ajouté dans l'usine correspond à une copie de celui passé en parametre
    	if(obj==0) 
    	{
    		return 0;
    	}	
    	else if(!catalogue.count(_identifiant)) 
    	{ 
    		catalogue.insert(pair<string, Forme*>(_identifiant,obj->dupliquer())); 
    		return 1; 
    	}
    	else
    	{
    		return 0;
    	}
    }
     
    //retirerForme permet de retirer une forme en supprimant le pointeur sur la forme stocké dans l'usine puis en supprimant la ligne dans la map.
    bool Usine::retirerForme(const string &_identifiant)
    {		
    	map<string,Forme*>::iterator it;
     
    	it = catalogue.find(_identifiant);
    	if(it==catalogue.end()) return 0;
    	else
    	{
    		delete (*it).second;
     
    		//On efface une ligne de la map	
    		catalogue.erase(it);
    		return 1;
    	}
    }
     
    //Cette méthode consiste à chercher et à dupliquer une forme dans une usine
    Forme* Usine::creerForme(const string &_identifiant) const
    {
    	//On recupère une forme dans la map sur la base d'un Id et on le retourne
    	//Déclaration d'un itérateur de map de type const permettant 
    	map<string,Forme*>::const_iterator it;
    	it = catalogue.find(_identifiant);
    	return ((*it).second)->dupliquer();	
    }
     
    //obtenirCles permet de récupérer la liste des clés de l'usine en parcourant toutes l'usine (classe map).
    vector<string> Usine::obtenirCles(void) const
    {
    	vector<string> vect;
     
    	//Déclaration d'un itérateur de map de type const permettant 
    	map<string,Forme*>::const_iterator it;
     
    	//On lit chaque ligne de la map et on affiche sa clé
      	for(it=catalogue.begin() ; it != catalogue.end(); it++) 
    	{	
    		vect.push_back((*it).first); 
    	}
    	return vect;
    }
     
     
    #endif

  4. #4
    screetch
    Invité(e)
    Par défaut
    c'est parce que tu ne libères jamais tes polygones, qui eux a leur tour ne libèreront jamais leurs vecteurs. Les vecteurs sont bien libérés automatqiuement pour peu que tu libère bien tes polygones

  5. #5
    screetch
    Invité(e)
    Par défaut
    au vu du rapport de leaks je dirais met un mot clé "virtual" avant le destructeur de Forme =)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    Citation Envoyé par screetch Voir le message
    au vu du rapport de leaks je dirais met un mot clé "virtual" avant le destructeur de Forme =)
    MMmmmm comment te dire ...

    Merci !

    Merci Trademark aussi pour le dérangement.



    C'est quand même un peu frustrant ...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 9
    Par défaut
    Il me semble que si pourtant, dans mon main j'ai bien fait le delete tmp

    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
    string nomPolygone;
    int nombrePoints;
    vector<double> xPolygone, yPolygone;
    double xTmp, yTmp;
    Forme* tmp;
     
    cout << "Identifiant de votre Polygone ?" << endl;	
    cin >> nomPolygone;
    cout << "" << endl;
    cout << "Combien de points contiendra votre polygone ?" << endl;	
    cin >> nombrePoints;
    cout << "" << endl;
     
    for(i=0;i<nombrePoints;i++)
    {
    	cout << "Enregistrement N " << i+1 << " :" << endl;
    	cout << "--------------------" << endl;
     
    	cout << "X = ";
    	cin >> xTmp;						
    	cout << "Y = ";
    	cin >> yTmp;
    	xPolygone.push_back(xTmp);
    	yPolygone.push_back(yTmp);
    }
    tmp = new Polygone(xPolygone, yPolygone);
    test = U.ajouterForme(nomPolygone,tmp);
     
    if(test) cout << "Ajout réussi" << endl;
    else cout << "Ajout non réussi - la clé existe déjà" << endl;
     
    delete tmp;
    et dans Usine.cpp, mon destructeur détruit les pointeurs Forme*

    Il manque des destructeurs ou selon toi ?

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

Discussions similaires

  1. Map et fuite mémoire
    Par transgohan dans le forum Langage
    Réponses: 17
    Dernier message: 17/12/2012, 15h21
  2. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  3. Fuites mémoires avec Vector
    Par ..alex.. dans le forum SL & STL
    Réponses: 15
    Dernier message: 10/08/2006, 11h35
  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