2012-04-29 15 views
6

¿Cómo funciona un std::vector<std::string> inicializar su auto cuando el siguiente código se invoca¿Cómo funciona el constructor de copias de std :: vector?

std::vector<std::string> original; 
std::vector<std::string> newVector = original; 

Parecería como si el constructor de copia se invoca en std::vector<std::string> new durante newVector = original, pero ¿cómo son los std::string 's traídos dentro de la orginal? ¿Son copias o nuevos std::string? Así es la memoria en newVector[0] lo mismo que original[0].

La razón que pido es decir hago lo siguiente

#include <vector> 
#include <string> 
using namespace std; 

vector<string> globalVector; 

void Initialize() { 
    globalVector.push_back("One"); 
    globalVector.push_back("Two"); 
} 

void DoStuff() { 
    vector<string> t = globalVector; 
} 

int main(void) { 
    Initialize(); 
    DoStuff(); 
} 

t caerá fuera del alcance de DoStuff (en una versión no optimizada), pero si t se acaba de llenar con punteros a la std::string ' s en globalVector, se puede llamar al destructor y se borra la memoria utilizada en std::string, allí para hacer globalVector[0] lleno de basura std::string después de llamar a DoStuff?

Una cáscara de nuez, básicamente estoy preguntando, cuando se llama al constructor de copia std::vector, ¿cómo se copian los elementos dentro?

+4

Bastante seguro de que esto fue solo un ejemplo, pero en su primer bloque de código, 'std :: vector new = original;', ese 'new' no es un nombre de variable legal. Estoy seguro de que sabes que es una palabra clave reservada. –

+0

@ChrisA .: Tiene razón, era solo el código de prueba – chadb

Respuesta

12

std::vector y la mayoría de los otros contenedores de biblioteca estándar almacenan elementos por valor. Los elementos se copian en la inserción o cuando se copia el contenedor. std::string también mantiene su propia copia de los datos, en lo que respecta a su uso de la misma.

+3

Donde más == todos. –

+2

@BenjaminLindley: Tiene razón, en lo que respecta al usuario del contenedor. Sin embargo, como probablemente sepa, Stroustrup nos recuerda que algunos contenedores, como 'std :: string', pueden copiar datos * de forma perezosa, * lo que significa que la acción de copia real podría no realizarse internamente hasta que una de las cadenas (el original o la copia) se usa de una manera que requiere que se haya hecho. En cualquier caso, creo que el que responde es técnicamente correcto al decir * la mayoría * en este caso, especialmente en la forma en que calificó su uso. – thb

+2

@thb 'std :: string' es solo una especie de contenedor, está restringido a" tipos de tipo char "(es decir, no puede almacenar otros contenedores), y copy-on-write está en desuso debido a que prevalece el multihilo. – Potatoswatter

Cuestiones relacionadas