Какой лучший способ удалить std::string из памяти, выделенной в куче, когда я это сделаю? Спасибо!
Как правильно освободить std::string из памяти
Ответ 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 вы должны быть педантичными даже на вопросы новичков).
Ответ 2
std::string foo("since it on the stack, it will auto delete out of scope");
или
std::string* foo = new std::string("allocated on the heap needs explicit destruction")
delete foo;
Ответ 3
Используйте delete
, если он находится в куче, и ничего не происходит, если он находится в стеке.
Ответ 4
void foo() {
string* myString = new string("heap-allocated objects are deleted on 'delete myString;'");
cout << *myString << endl;
delete myString;
}
или еще лучше, избегайте указателей, когда это возможно, и используйте автоматические переменные:
void foo() {
string myString("stack-allocated string is automatically deleted when myString goes out of scope");
cout << myString << endl;
}
Ответ 5
просто рассматривайте std::string как любой базовый тип.
std::string *str = new std::string("whatever");
///code
delete str;