61 votos

¿Está std::vector copiando los objetos con un push_back?

Después de muchas investigaciones con valgrind, he llegado a la conclusión de que std::vector hace una copia de un objeto que se quiere push_back.

¿Es eso cierto? Un vector no puede mantener una referencia o un puntero de un objeto sin una copia?

Gracias

63voto

Alexander Gessler Puntos 26717

Sí, std::vector<T>::push_back() crea una copia del argumento y lo almacena en el vector. Si quieres almacenar punteros a objetos en tu vector, crea un std::vector<whatever*> en lugar de std::vector<whatever> .

Sin embargo, hay que asegurarse de que los objetos referenciados por los punteros sigan siendo válidos mientras el vector mantenga una referencia a ellos (los punteros inteligentes que utilizan el lenguaje RAII resuelven el problema).

26voto

Georg Fritzsche Puntos 59185

Sí, std::vector almacena copias. ¿Cómo debería vector saber cuál es la vida útil prevista de sus objetos?

Si quieres transferir o compartir la propiedad de los objetos utiliza punteros, posiblemente punteros inteligentes como shared_ptr (encontrado en Impulsar o TR1 ) para facilitar la gestión de los recursos.

11voto

Reed Copsey Puntos 315315

std::vector siempre hace una copia de lo que se almacena en el vector.

Si está guardando un vector de punteros, entonces hará una copia del puntero, pero no del ser de instancia al que apunta el puntero. Si está tratando con objetos grandes, puede (y probablemente debería) utilizar siempre un vector de punteros. A menudo, el uso de un vector de punteros inteligentes de un tipo apropiado es bueno por razones de seguridad, ya que el manejo de la vida del objeto y la gestión de la memoria puede ser difícil de otra manera.

3voto

Liz Albin Puntos 1371

No sólo std::vector hace una copia de lo que sea que esté devolviendo, sino que la definición de la colección establece que lo hará, y que no puede usar objetos sin la semántica de copia correcta dentro de un vector. Así, por ejemplo, no se usa auto_ptr en un vector.

0voto

rahmivolkan Puntos 383

si no quieres las copias; entonces la mejor manera es usar un vector de punteros (u otra estructura que sirva para el mismo objetivo). si quieres las copias; usa directamente push_back(). no tienes otra opción.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X