Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 21h03   #1
gigacool1994
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
Par défaut Suppression élément d'un tableau dynamique

Salut tout le monde j'ai un petit probleme dans mon code source j’essaie de supprime une case d'un tableau dynamique de pointeur sur une class mais ca marche pas apparemment
main.c++:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "vehicule.h"
#include <vector>
using namespace std;
int main()
{
   Garage a;
   vector<Vehicule*>listeVehicule;
   listeVehicule.push_back(new Voiture(15000,2000,5));
   listeVehicule.push_back(new Moto(5000,2009,150));
   listeVehicule.push_back(new Moto(10000,1980,200));
   listeVehicule.push_back(new Camion(200000,1999,700));
   listeVehicule[0]->affiche();
   listeVehicule[2]->affiche();
   a.suprimer(listeVehicule);
   listeVehicule[3]->affiche();
   for(int i=0;i<listeVehicule.size();i++)
   {
       delete listeVehicule[i];
       listeVehicule[i]=0;
   }
    return 0;
}
fichier.c++
Code :
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
#include"vehicule.h"
#include <iostream>
#include <vector>
using namespace std;
Vehicule::Vehicule()
{
 
}
Vehicule::Vehicule(int prix,int annee):m_prix(prix),m_annee(annee)
{}
void Vehicule::affiche()const
{
    cout << "Ceci est un vehicule coutant " << m_prix << " euros." << endl;
}
Vehicule::~Vehicule()
{}
Moto::Moto(int prix,int annee,double vitesse):Vehicule(prix,annee),m_vitesse(vitesse)
{}
void Moto::affiche()const
{
      cout <<endl<<"Ceci est une moto allant a " << m_vitesse << " km/h et coutant " << m_prix << " euros." << endl;
      cout<<"Date de fabrication:"<<m_annee;
}
Moto::~Moto()
{}
Voiture::Voiture(int prix,int annee,int porte):Vehicule(prix,annee),m_porte(porte)
{}
void Voiture::affiche()const
{
    cout << "Ceci est une voiture avec " << m_porte << " portes et coutant " << m_prix << " euros." << endl;
          cout<<"Date de fabrication:"<<m_annee;
}
Voiture::~Voiture()
{}
Camion::Camion(int prix,int annee,double poids):Vehicule(prix,annee),m_poids(poids)
{}
void Camion::affiche()const
{
      cout <<endl<<"Ceci est une camion allant a " << m_poids << " kg et coutant " << m_prix << " euros." << endl;
           cout<<"Date de fabrication:"<<m_annee;
 
}
Camion::~Camion()
{}
Garage::Garage()
{
 
}
void Garage::ajouterVoiture(int porte,int prix,int annee,std::vector<Vehicule*>&listeVehicule)
{
}
void Garage::suprimer(std::vector<Vehicule*>&listeVehicule)
{
listeVehicule.pop_back();
listeVehicule[3]->affiche();
}
Garage::~Garage()
{
 
}
fichier.h
Code :
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
#ifndef VEHICULE_H_INCLUDED
#define VEHICULE_H_INCLUDED
#include<vector>
class Vehicule
{
 public:
 Vehicule();
 Vehicule(int prix,int annee);
 virtual void affiche()const;
 virtual ~ Vehicule();
 protected:
 int m_prix,m_annee;
};
class Moto:public Vehicule
{
 public:
 Moto(int prix,int annee,double vitesse);
 virtual void affiche()const;
 virtual ~ Moto();
 private:
 double m_vitesse;
 ;
};
class Voiture:public Vehicule
{
 public:
 Voiture(int prix,int annee,int porte);
 virtual void affiche()const;
 virtual ~ Voiture();
 private:
 int m_porte;
};
class Camion:public Vehicule
{
 public:
 Camion(int prix,int annee,double poids);
 virtual void affiche()const;
 virtual~Camion();
 private:
 double m_poids;
};
class Garage
{
 public:
 Garage();
 void ajouterVoiture(int porte,int prix,int annee,std::vector<Vehicule*>&listeVehicule);
 virtual void suprimer(std::vector<Vehicule*>&listeVehicule);
 virtual ~Garage();
 private:
};
#endif // VEHICULE_H_INCLUDED
gigacool1994 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 22h03   #2
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 751
Points : 751
Code :
1
2
3
4
5
void Garage::suprimer(std::vector<Vehicule*>&listeVehicule)
{
listeVehicule.pop_back();
listeVehicule[3]->affiche();
}
Si listeVehicule a 4 éléments, pop_back n'en laisse plus que 3.
Donc les listeVehicule[3] qui suivent font planter, c'est normal.
cob59 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 22h34   #3
gigacool1994
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
desole,mais j'ai pas compris votre deuxieme phrase veuillez vous expliquez si c'est possible
gigacool1994 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 22h50   #4
LinuxUser
Membre éprouvé
 
Avatar de LinuxUser
 
Inscription : avril 2007
Messages : 748
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 748
Points : 418
Points : 418
Citation:
Envoyé par cob59 Voir le message
Code :
1
2
3
4
5
void Garage::suprimer(std::vector<Vehicule*>&listeVehicule)
{
listeVehicule.pop_back();
listeVehicule[3]->affiche();
}
Si listeVehicule a 4 éléments, pop_back n'en laisse plus que 3.
Donc les listeVehicule[3] qui suivent font planter, c'est normal.
Ce que veux t'expliquer cob59, c'est qu'après le pop_back tu n'as plus que trois éléments dans ta liste: listeVehicule[0], listeVehicule[1] et listeVehicule[2].

Donc en faisant listeVehicule[3] tu veux accéder à un élément qui n'existe plus, d où le plantage.
LinuxUser est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/01/2013, 23h07   #5
gigacool1994
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
le probleme c'est que ca ne plante pas,je veux juste m'assurer que pop_back fait son devoir mais ca marche pas car apres affiche le message s'affiche :<
gigacool1994 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 23h48   #6
Fabien_
Candidat au titre de Membre du Club
 
Homme Fabien Aulaire
Ingénieur développement logiciels
Inscription : novembre 2009
Messages : 2
Détails du profil
Informations personnelles :
Nom : Homme Fabien Aulaire
Âge : 25
Localisation : France, Val d'Oise (Île de France)

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

Informations forums :
Inscription : novembre 2009
Messages : 2
Points : 12
Points : 12
Hello,

Lorsque tu fais ton pop, tu dis à l'objet vecteur qu'il y a un élément de moins ( mais tu ne fais pas de delete, l'objet existe donc toujours).
Ce qu'il faut savoir c'est que les éléments d'un vecteur sont alignés en mémoire.
Donc après ton pop, quand tu utilise l'opérateur [] pour accéder à l'élément 3 celui ci existe toujours car il n'a pas été libéré.

Pour vérifier que ton pop fait ce qu'il faut, si tu utilise Visual en mode Debug un assert "out of range" se déclenchera.
Fabien_ est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/01/2013, 23h49   #7
cob59
Membre chevronné
 
Inscription : décembre 2008
Messages : 490
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 490
Points : 751
Points : 751
Explication courte :
Utiliser les [] aveuglément peut conduire à ce genre de bug. La méthode std::vector::at() est équivalente mais déclenchera une erreur systématique et moins ambigue (une exception) dans ce genre de cas.

Explication détaillée :
Quand tu fais un appel à pop_back() sur ton vecteur, il ne "supprime" pas le dernier élément ; il se contente de réduire de 1 le compteur d'éléments du vecteur sans pour autant réduire la taille de sa "mémoire" interne. Les types qui n'ont pas de destructeur (types primitifs et pointeurs) sont même laissés tels quels : en effet, pourquoi perdrait-on du temps à les réinitialiser puisqu'ils sont inaccessibles par une utilisation régulière (donc hormis listeVehicule[3]) de std::vector ?

Donc listeVehicule[3] accède bien au même pointeur avant et après l'appel de pop_back(). Et comme tu n'as pas appelé delete sur le contenu de listeVehicule[3] (ce qui par ailleurs constitue une fuite mémoire), l'objet Vehicule pointé existe toujours donc affiche() fonctionne sans problème.
cob59 est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/01/2013, 23h52   #8
gigacool1994
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2013
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2013
Messages : 4
Points : 2
Points : 2
Par défaut Merci

Merci pour vos explication ca m'a aider,merci
gigacool1994 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h39.


 
 
 
 
Partenaires

Hébergement Web