I valori nei contenitori STL sono memorizzati in base al valore. Se si dispone di un vettore come questo:.
class BigObject
{
...
};
vector<BigObject> myObjs;
myObjs.push_back(obj1);
myObjs.push_back(obj2);
...
Il vettore farà una copia dell'oggetto si sta spingendo nella Anche nel caso di un vettore, può fare nuove copie tardi quando deve riallocare la memoria sottostante, quindi tienilo a mente.
La stessa cosa è vera quando si dispone di un vettore di puntatori, come vector<char*>
- ma la differenza è che il valore che è copie è il puntatore, non la stringa a cui punta. Quindi, se si dispone di:
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;
... il vettore otterrà una copia del puntatore. Il puntatore che ottiene avrà lo stesso valore (0x1234), e dal momento che tu hai delete
d quel puntatore dopo aver premuto il puntatore, il tuo vettore contiene un puntatore jolly e il tuo codice finirà per bloccarsi (prima o poi, si spera).
Il che, tra l'altro, si sarebbe potuto evitare se invece di utilizzare char * s voi stringhe utilizzate:
typedef vector<string> strings;
strings myStrings;
myStrings.push_back("Hello, buffer");
fonte
2010-02-02 21:09:38
Per essere chiari, i contenitori copiano il valore del tipo di argomento del modello di elemento. Se il contenitore è definito per contenere "int *", copierà i puntatori agli interi, non agli interi sottostanti. –