Когда вы объявляете массив C ++, он создает все объекты в стеке и остается там до тех пор, пока сам массив не будет удален:
std::string ArrayOfStrings[10]; //There are now ten strings here
Объекты не могут быть «удалены» из этоговид массива.Когда ArrayOfStrings выходит из области видимости, он автоматически удаляет все строки в массиве.Если вы редактируете объект в этом массиве, сам этот объект изменяется.Вы действительно изменили саму строку, а не какой-либо указатель или ссылку.
Если у вас есть массив указателей, то C ++ создает все указатели, но вы должны сами управлять тем, на что они указывают:
std::string* ArrayOfPointersToStrings[10];
Вы можете вручную удалить строки, на которые указывают указатели в массиве, но вы должны сделать все это самостоятельно.Когда ArrayOfPointersToStrings выходит из области видимости, он НЕ удаляет ничего, на что указывают строки.Если вы редактируете указатель, не удаляя его первым, это утечка памяти, и это плохо.
Если у вас есть std :: vector, C ++ создает только некоторые объекты в зависимости от того, как вы его создаете:
std::vector<std::string> VectorOfStrings(10);
Это создает динамический массив строк.Можно удалить объекты из вектора, и в этом случае вектор мгновенно удаляет его и переставляет все остальное для вас.Если вы редактируете объект в этом массиве, сам этот объект изменяется.Вы действительно изменили саму строку, а не какой-либо указатель или ссылку.
Чтобы уточнить комментарии:
char *myLiteral = "APPLE";
//"APPLE" is an immutable string, myLiteral points at it.
std::string s= myLiteral;
std::string t = myLiteral;
//s and t each makes a _seperate_ _mutable_ copy of "APPLE"
s[3] = '?';
//s is now "APP?E", because we just changed the L. NO COPY WAS DONE.
std::cout << t[3];
//displays "L", because t's copy was never changed.