-
Problème de pointeurs
Bonsoir,
alors voici mon problème : j'ai une liste l de pointeurs sur des objets. Les objets sont ici des noeuds.
Lorsque je fais un delete l.back() je peux toujours accéder par la suite à l'élément supprimer en faisant (*l.back()).getNumero() par exemple.
Je ne comprends pas pourquoi alors que normalement je ne devrai plus pouvoir y accéder. J'ai bien regarder dans la fac mais je ne trouve rien qui m'aide.
Merci par avance de votre aide.
Aurelien2201
-
Il faudrait plutôt utiliser une liste fournie par boost.pointer_container ; ce qui éviterait la gestion de la mémoire.
Ou bien utiliser des shared/unique_ptr au lieu de pointeurs purs.
Et, là, la question ne se poserait même plus. ;)
(Au passage, l'artefact que tu remarques vient de ta plate-forme, et risque même de ne plus fonctionner après une mise à jour - et ne marchera probablement pas sous un autre OS / compilateur / jeu d'optimisations.)
-
Merci pour la rapidité de votre réponse mais, du coup est ce que la mémoire à bien été libérée?
Pour palier à ça après avoir désallouer la mémoire je fais un pop_back mais c'est du bricolage...
Je vais regarder avec vos indications
aurelien2201
-
La mémoire est bien libérée après l'appel à delete ; même si elle reste disponible.
En fait, c'est une optimisation que de ne pas effacer toute la mémoire disponible à l'appel à delete. Celui-ci sert alors simplement à indiquer à l'OS qu'il peut récupérer la mémoire dès qu'il le souhaite. ;)
Pour l'appel à pop_back, il est en effet préférable d'appeller pop_back après le delete. Parce que sinon on se retrouve avec un dangling pointer, c'est-à-dire un pointeur qui pointe dans le néant. Et ça, c'est risqué.
Au passage, utiliser une des solutions que je proposais dans mon post précédent permettrait de ne plus avoir à faire de delete et de faire directement liste.pop_back(). De plus, elle permettrait de gagner l'exception safety, c'est-à-dire la résistance aux exceptions ; ce qui permettrait de ne pas avoir à se soucier de tous les try{} catch{} à chaque utilisation de la liste. ;)
-
Je vous remercie de m'avoir renseigné aussi rapidement et aussi efficacement.
Maintenant mon code marche et je vais tester les améliorations que vous m'avez suggéré.
Encore merci.
Aurelien2201