std vector : tracking des adresses des objets contenus

std vector : tracking des adresses des objets contenus - C++ - Programmation

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  :whistle:  
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  :o  
 
Merci  :jap:


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 24-07-2008 à 18:18:00   

Reply

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.

Reply

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.


---------------
Un blog qu'il est bien
Reply

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


Message édité par Taz le 24-07-2008 à 23:53:20
Reply

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é)
 
;)

Message cité 1 fois
Message édité par Malkav le 28-07-2008 à 16:56:43
Reply

Marsh Posté le 28-07-2008 à 16:56:25    

guepe a écrit :


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.


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).

Reply

Marsh Posté le 28-07-2008 à 17:15:32    

Malkav a écrit :


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é)
 
;)


 
;) j'avais un peu élargi certes :)

Reply

Marsh Posté le 30-07-2008 à 16:46:34    

Joel F a écrit :


 
;) j'avais un peu élargi certes :)


bah entre anciens ZZ ;)

Reply

Marsh Posté le 30-07-2008 à 19:02:53    

Malkav a écrit :


bah entre anciens ZZ ;)


 
^^ quelle promo (MP pr la suite :o)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed