std vector : tracking des adresses des objets contenus - C++ - Programmation
Marsh Posté le 24-07-2008 à 18:57:09
erase et insert invalide TOUT les itérateurs et adresses des objets contenus. Je te conseillerais plutôt d'utiliser std::list avec ta map car , si je ne m'abuse le erase de list est iterator-preserving.
Marsh Posté le 24-07-2008 à 19:24:11
Joel F a écrit : erase et insert invalide TOUT les itérateurs et adresses des objets contenus. Je te conseillerais plutôt d'utiliser std::list avec ta map car , si je ne m'abuse le erase de list est iterator-preserving. |
Ok merci... cependant je vais allouer mes objets avec new, ca fera moins de changements, et je suis certain dans ce cas que l'adresse ne change pas.
Merci en tout cas, j'utiliserai plus souvent list dans ce cas.
Marsh Posté le 24-07-2008 à 23:52:36
euh moi je lis que t'en chies avec tes pointers et que ça te pète à la gueule quand t'accèdes à un truc que t'as déjà delete. Il te faut des weak reference et voilà.
http://www.boost.org/doc/libs/1_35 [...] ak_ptr.htm
Marsh Posté le 28-07-2008 à 16:48:12
Joel F a écrit : erase et insert invalide TOUT les itérateurs et adresses des objets contenus. Je te conseillerais plutôt d'utiliser std::list avec ta map car , si je ne m'abuse le erase de list est iterator-preserving. |
histoire de pinailler :
erase invalide seulement les itérateurs depuis la position effacée jusqu'à la fin du vecteur
insert invalide TOUT les itérateurs en cas de réallocation (sinon seulement de la position d'insertion à la fin du vecteur, mais dans le doute tjs considérer que tout est invalidé)
Marsh Posté le 28-07-2008 à 16:56:25
guepe a écrit : |
ce que tu veux dire par là c'est que tu vas stocker des pointeurs vers tes objets et non plus des objets dans ton vector ?
effectivement dans ce cas çà marche, tes objets ne bougeront pas en mémoire (mais gaffe à bien gérer les désallocations et les accès).
Si tu fais souvent des ajouts/suppressions un peu n'importe où pense à la liste qui est plus efficace pour gérer ce genre de chose, un vecteur c'est plus rapide en accès, çà prend moins de mémoire mais c'est bcp plus lent pour les erase et autres insert (push_back aussi en cas de réallocation mais çà n'arrive pas tjs).
Marsh Posté le 28-07-2008 à 17:15:32
Malkav a écrit : |
j'avais un peu élargi certes
Marsh Posté le 30-07-2008 à 16:46:34
ReplyMarsh Posté le 30-07-2008 à 19:02:53
Reply
Marsh Posté le 24-07-2008 à 18:18:00
Bonjour !
Je pense avoir trouve un soucis dans mon application... je ne suis pas encore certain, mais je pose la question avant d'aller en pause
J'ai un vector contenant des objets qui ne sont pas des pointeurs (ce sont des structures allouees, sans pointeurs). J'enregistre dans une std map l'adresse memoire de certains de mes objets.
Au fur et a mesure que je track ces pointeurs, je les supprime de mon vecteur : la, deux comportement peuvent arriver (ca varie a chaque lancement).
- Soit lorsque j'accede a mes objets via les pointeurs enregistres je me retrouve a des adresses ne correspondant pas, donc dans un autre objet, a cheval entre deux... bref pas good
- Soit lors du tracking j'ai un segfault parce que j'accede a l'objet, et il semble que l'objet ai bouge de place.
Ma question est : bien que je puisse passer mon vecteur vers des objets construits par new, est-ce que lorsque je demande un erase dans mon vecteur, les objets peuvent changer d'adresse ?
Je pose cette question pour mieux comprendre le comportement de std vector... et je vous remercie d'elever ma culture
Merci
---------------
Un blog qu'il est bien