|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité de passage
![]() Étudiant Inscription : janvier 2013 Messages : 4 ![]() |
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 :
Code :
Code :
|
||||||
|
|
00
|
|
|
#2 | ||
|
Membre chevronné
![]() ![]() Inscription : décembre 2008 Messages : 490 ![]() |
Code :
Donc les listeVehicule[3] qui suivent font planter, c'est normal. |
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Étudiant Inscription : janvier 2013 Messages : 4 ![]() |
desole,mais j'ai pas compris votre deuxieme phrase veuillez vous expliquez si c'est possible
|
|
|
00
|
|
|
#4 | |||
|
Membre éprouvé
![]() Inscription : avril 2007 Messages : 748 ![]() |
Citation:
Donc en faisant listeVehicule[3] tu veux accéder à un élément qui n'existe plus, d où le plantage. |
|||
|
|
10
|
|
|
#5 |
|
Invité de passage
![]() Étudiant Inscription : janvier 2013 Messages : 4 ![]() |
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 :<
|
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Fabien AulaireIngénieur développement logiciels Inscription : novembre 2009 Messages : 2 ![]() |
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. |
|
|
20
|
|
|
#7 |
|
Membre chevronné
![]() ![]() Inscription : décembre 2008 Messages : 490 ![]() |
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. |
|
|
20
|
|
|
#8 |
|
Invité de passage
![]() Étudiant Inscription : janvier 2013 Messages : 4 ![]() |
Merci pour vos explication ca m'a aider,merci
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com