Подтвердить что ты не робот

Как правильно освободить std::string из памяти

Какой лучший способ удалить std::string из памяти, выделенной в куче, когда я это сделаю? Спасибо!

4b9b3361

Ответ 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;