it-swarm-ru.tech

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

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

33
IDWMaster

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

61
Matteo Italia
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;
6
The Communist Duck

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

4
Oliver Charlesworth
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;
}
1
Lie Ryan

Вы можете обращаться с 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
user4580891

просто относитесь к std :: string как к любому основному типу.

std::string *str = new std::string("whatever");
///code
delete str;
0
yu quan