159 votes

Est-ce que std::vector copie les objets avec un push_back ?

Après beaucoup d'investigations avec valgrind, j'en suis arrivé à la conclusion que std::vector fait une copie d'un objet que l'on veut pousser en arrière.

Est-ce vraiment vrai ? Un vecteur ne peut pas garder une référence ou un pointeur d'un objet sans copie !

Gracias

177voto

Alexander Gessler Points 26717

Oui, std::vector<T>::push_back() crée une copie de l'argument et la stocke dans le vecteur. Si vous souhaitez stocker des pointeurs vers des objets dans votre vecteur, créez un objet std::vector<whatever*> au lieu de std::vector<whatever> .

Cependant, vous devez vous assurer que les objets référencés par les pointeurs restent valides tant que le vecteur contient une référence à eux (les pointeurs intelligents utilisant l'idiome RAII résolvent le problème).

34voto

Georg Fritzsche Points 59185

Oui, std::vector stocke des copies. Comment doit-on vector savoir quelle est la durée de vie prévue de vos objets ?

Si vous souhaitez transférer ou partager la propriété des objets, utilisez des pointeurs, éventuellement des pointeurs intelligents tels que shared_ptr (trouvé dans Boost o TR1 ) pour faciliter la gestion des ressources.

15voto

Reed Copsey Points 315315

Std::vector fait toujours une copie de ce qui est stocké dans le vecteur.

Si vous gardez un vecteur de pointeurs, alors il fera une copie du pointeur, mais pas de l'instance vers laquelle le pointeur pointe. Si vous avez affaire à de gros objets, vous pouvez (et devriez probablement) toujours utiliser un vecteur de pointeurs. Souvent, l'utilisation d'un vecteur de pointeurs intelligents d'un type approprié est une bonne chose pour des raisons de sécurité, car la gestion de la durée de vie des objets et de la mémoire peut être délicate autrement.

3voto

Liz Albin Points 1371

Non seulement std::vector fait une copie de ce que vous repoussez, mais la définition de la collection indique qu'elle le fera, et que vous ne pouvez pas utiliser d'objets sans la sémantique de copie correcte dans un vecteur. Ainsi, par exemple, vous ne pouvez pas utiliser auto_ptr dans un vecteur.

0voto

rahmivolkan Points 383

Si vous ne voulez pas les copies ; alors la meilleure façon est d'utiliser un vecteur de pointeurs (ou une autre structure qui sert au même but). si vous voulez les copies ; utilisez directement push_back(). vous n'avez pas d'autre choix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X