Это довольно неловко.
<string.h>
- заголовок C. Это не определяет string
. Похоже, ваша версия <iostream>
прямо или косвенно включает <string>
, иначе будет ошибка.
Строковые литералы (те, которые разделены парными кавычками) могут быть практически везде, включая сегмент памяти только для чтения. (Они занимают память, но у вас должно быть очень много текста, чтобы иметь значительное влияние: что-то вроде Война и мир не займет целого мег.) В этом случае , std::string
инициализируется с этим значением, и позже ему присваивается другое значение. std::string
обрабатывает используемую память.
В C ++ почти нет причин указывать на std::string
. std::string
не занимает много места без своего содержимого и управляет памятью для самого содержимого. Вы путаете это с char *
?
Вы new
a std::string
для b
, а затем вы присваиваете другой адрес b
без delete
памяти. Это утечка памяти. То, что вы new
отредактировали для b
, по-прежнему выделено, но нет способа delete
сделать это, поэтому оно будет занимать память на время работы программы.
Затем, как только вы присвоили адрес от a
до b
, вы delete b;
. Это плохая идея, и она, вероятно, испортит что-то важное, возможно, непредсказуемым образом. Только delete
памяти, которую вы приобрели с new
. (Здесь важно для delete
ing не то, что b
является указателем и должен быть удален, а то, что память, на которую он указывает, не была получена через new
.)
Управление памятью работает примерно так. Строковый литерал размещается где-то. Все, что вы знаете, это то, что вы не должны пытаться изменить его или delete
каким-либо образом. Используйте значение и не трогайте остальное. A std::string
управляет памятью для своего собственного содержимого и позаботится об этом в своем деструкторе. Переменная, объявленная в функции или другом блоке, будет уничтожена, как только она выйдет из области видимости (хотя все, на что она может указывать, не будет уничтожено автоматически; только если это умный указатель или она управляет собственной памятью или чем-то еще). Если у вас new
памяти, не выбрасывайте значение указателя, пока оно не станет delete
d. Если у вас нет new
памяти, не delete
это.