Ответ 1
std::string
является просто нормальным классом 1 поэтому применяются обычные правила.
Если вы выделяете std::string
объекты в стеке, как глобальные, как члены класса,... вам не нужно делать что-либо особенное, когда они выходят из области, из которой их деструктор вызывается, и он заботится о автоматически освобождая память, используемую для строки.
int MyUselessFunction()
{
std::string mystring="Just a string.";
// ...
return 42;
// no need to do anything, mystring goes out of scope and everything is cleaned up automatically
}
Единственный случай, когда вам нужно что-то сделать, - это выделить std::string
в кучу с помощью оператора new
; в этом случае, как и для любого объекта, выделенного с помощью new
, вы должны вызвать delete
, чтобы освободить его.
int MyUselessFunction()
{
// for some reason you feel the need to allocate that string on the heap
std::string * mystring= new std::string("Just a string.");
// ...
// deallocate it - notice that in the real world you'd use a smart pointer
delete mystring;
return 42;
}
Как подразумевается в этом примере, в общем случае бессмысленно выделять std::string
в куче, и, когда вам это нужно, вы все же должны инкапсулировать такой указатель в интеллектуальный указатель, чтобы избежать даже рисковать утечками памяти (в случае исключения, множественные пути возврата,...).
-
Фактически
std::string
определяется какnamespace std { typedef std::basic_string<char> string; };
поэтому он является синонимом для создания шаблона класса
basic_string
для символов типаchar
(это ничего не меняет в ответе, но на SO вы должны быть педантичными даже на вопросы новичков).