Как правильно освободить std :: string из памяти - PullRequest
38 голосов
/ 12 февраля 2011

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

Ответы [ 6 ]

65 голосов
/ 12 февраля 2011

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в кучу, и, когда вам это нужно, вы все равно должны инкапсулировать такой указатель в интеллектуальный указатель, чтобы избежать даже риска утечек памяти (в случае исключений, несколько путей возврата, ...).

  1. На самом деле std::string определяется как

    namespace std
    {
        typedef std::basic_string<char> string;
    };
    

    , так что это синоним для создания экземпляра класса шаблона basic_string для символов типа char (это неВ ответе ничего нельзя изменить, но на ТАКОМ вы должны быть педантичными даже на вопросы новичка).

7 голосов
/ 12 февраля 2011
std::string foo("since it's 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;
4 голосов
/ 12 февраля 2011

Используйте delete, если он в куче, и вообще ничего, если он в стеке.

1 голос
/ 12 февраля 2011
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;
}
0 голосов
/ 29 мая 2018

Вы можете относиться к std::string как к любому другому классу. Используйте new для выделения и delete, когда закончите. С C ++ 11 я не рекомендую использовать new и delete в большинстве случаев. Если вам нужно выделить строку в куче, используйте std :: shared_ptr, чтобы обернуть ее:

std::shared_ptr<std::string> my_string = std::make_shared<std::string>(std::string("My string"));

Как только все копии my_string выйдут из области видимости, соответствующая память будет удалена автоматически.

0 голосов
/ 21 августа 2015

просто обработайте std :: string как любой базовый тип.

std::string *str = new std::string("whatever");
///code
delete str;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...