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