Los valores en los contenedores STL se almacenan por valor. Si usted tiene un vector de la siguiente manera:.
class BigObject
{
...
};
vector<BigObject> myObjs;
myObjs.push_back(obj1);
myObjs.push_back(obj2);
...
El vector hará una copia del objeto que está empujando en También en el caso de un vector, puede hacer nuevas copias más tarde cuando se tiene que reasignar la memoria subyacente, así que tenlo en cuenta.
Lo mismo ocurre cuando tiene un vector de punteros, como vector<char*>
, pero la diferencia aquí es que el valor que se copia es el puntero, no la cadena a la que apunta. Por lo tanto, si tiene:
vector<char*> myStrings;
char* str = new char[256]; // suppose str points to mem location 0x1234 here
sprintf(str, "Hello, buffer");
myStrings.push_back(str);
delete [] str;
... el vector obtendrá una copia del puntero. El puntero que obtenga tendrá el mismo valor (0x1234), y dado que delete
d ese puntero después de presionar el puntero, su vector contiene un puntero salvaje y su código eventualmente se bloqueará (más temprano que tarde, con suerte).
Lo cual, por cierto, se podría haber evitado si en lugar de utilizar char * s le cadenas utilizadas:
typedef vector<string> strings;
strings myStrings;
myStrings.push_back("Hello, buffer");
Para que quede claro, los contenedores copian el valor del tipo de argumento de la plantilla del elemento. Si el contenedor está definido para contener "int *", copiará los punteros a enteros, no a los enteros subyacentes. –