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
(это неВ ответе ничего нельзя изменить, но на ТАКОМ вы должны быть педантичными даже на вопросы новичка).