Значения в контейнерах STL сохраняются по значению. Если у вас есть такой вектор:
class BigObject
{
...
};
vector<BigObject> myObjs;
myObjs.push_back(obj1);
myObjs.push_back(obj2);
...
Вектор создаст копию объекта, в который вы толкаете. Также в случае вектора он может сделать новые копии позже, когда ему придется перераспределить основную память, так что имейте это в виду.
То же самое верно, когда у вас есть вектор указателей, например vector<char*>
- но разница здесь в том, что значение, которое копирует, является указателем, а не строкой, на которую он указывает. Так что если у вас есть:
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;
... вектор получит копию указателя. Указатель, который он получает, будет иметь то же значение (0x1234), и, поскольку вы delete
d указатель после нажатия на указатель, ваш вектор содержит дикий указатель, и ваш код в конечном итоге потерпит крах (скорее, чем позже, надеюсь).
Чего, кстати, можно было бы избежать, если бы вместо char * s вы использовали строки:
typedef vector<string> strings;
strings myStrings;
myStrings.push_back("Hello, buffer");