Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2299 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  std vector : tracking des adresses des objets contenus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

std vector : tracking des adresses des objets contenus

n°1764451
guepe
J'ai du noir sur la truffe ?
Posté le 24-07-2008 à 18:18:00  profilanswer
 

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
mood
Publicité
Posté le 24-07-2008 à 18:18:00  profilanswer
 

n°1764463
Joel F
Real men use unique_ptr
Posté le 24-07-2008 à 18:57:09  profilanswer
 

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.

n°1764470
guepe
J'ai du noir sur la truffe ?
Posté le 24-07-2008 à 19:24:11  profilanswer
 

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
n°1764571
Taz
bisounours-codeur
Posté le 24-07-2008 à 23:52:36  profilanswer
 

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
n°1765963
Malkav
Posté le 28-07-2008 à 16:48:12  profilanswer
 

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
n°1765974
Malkav
Posté le 28-07-2008 à 16:56:25  profilanswer
 

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

n°1765997
Joel F
Real men use unique_ptr
Posté le 28-07-2008 à 17:15:32  profilanswer
 

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

n°1766813
Malkav
Posté le 30-07-2008 à 16:46:34  profilanswer
 

Joel F a écrit :


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


bah entre anciens ZZ ;)

n°1766901
Joel F
Real men use unique_ptr
Posté le 30-07-2008 à 19:02:53  profilanswer
 

Malkav a écrit :


bah entre anciens ZZ ;)


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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  std vector : tracking des adresses des objets contenus

 

Sujets relatifs
Sérialiser un objet contenant des objets.vector : problème accès aux caractères d'1 élé
Création de site de vente [ Galerie des Objets en vente ][ASP.NET] Accéder aux objets du Global.asax à partir d'un codefile ?
Lib3ds & objets X-Refcreer un grand nombre d'objets
Ajout d'un vector qui contient lui même un vectorGérer les objets COM
Concaténer deux vectorVector en C++ - Optimisation de la recherche
Plus de sujets relatifs à : std vector : tracking des adresses des objets contenus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR