it-swarm.com.de

So lösen Sie einen std :: string ordnungsgemäß aus dem Speicher

Was ist der beste Weg, um einen std :: string aus dem auf dem Heap zugewiesenen Speicher zu löschen, wenn ich damit fertig bin? Vielen Dank!

33
IDWMaster

std::string ist nur eine normale Klasse1, so gelten die üblichen Regeln.

Wenn Sie std::string-Objekte auf dem Stack als Globals, als Klassenmitglieder zuordnen, müssen Sie nichts Besonderes tun. Wenn sie den Gültigkeitsbereich verlassen, wird der Destruktor aufgerufen, und der Speicher wird für die Freigabe freigegeben die Zeichenfolge automatisch.

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
}

Der einzige Fall, in dem Sie etwas tun müssen, ist, wenn Sie mit dem Operator new auf dem Heap einen std::string zuweisen. In diesem Fall müssen Sie, wie bei jedem Objekt, das mit new zugewiesen wurde, delete aufrufen, um es freizugeben.

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;
}

Wie im Beispiel impliziert, ist es im Allgemeinen sinnlos, dem Heap einen std::string zuzuordnen, und wenn Sie dies benötigen, sollten Sie einen solchen Zeiger in einen intelligenten Zeiger einkapseln, um sogar Speicherlecks zu riskieren (bei Ausnahmen mehrere Rückgabepfade) , ...).


  1. Eigentlich ist std::string definiert als

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

    es ist also ein Synonym für die Instantiierung der Template-Klasse basic_string für Zeichen des Typs char (dies ändert nichts an der Antwort, aber auf SO müssen Sie müssen sogar bei Neulingen-Fragen pedantisch sein).

61
Matteo Italia
std::string foo("since it's on the stack, it will auto delete out of scope");

oder:

std::string* foo = new std::string("allocated on the heap needs explicit destruction")
delete foo;
6

Verwenden Sie delete, wenn es sich auf dem Heap befindet, und überhaupt nichts, wenn es sich auf dem Stapel befindet.

4
void foo() {
    string* myString = new string("heap-allocated objects are deleted on 'delete myString;'");
    cout << *myString << endl;
    delete myString;
}

oder besser noch, vermeiden Sie möglichst Zeiger und verwenden Sie automatische Variablen:

void foo() {
    string myString("stack-allocated string is automatically deleted when myString goes out of scope");
    cout << myString << endl;
}
1
Lie Ryan

Sie können std::string wie jede andere Klasse behandeln. Verwenden Sie new für die Zuordnung und delete, wenn Sie damit fertig sind . Mit C++ 11 empfehle ich in den meisten Fällen die Verwendung von new und delete nicht. Wenn Sie die Zeichenfolge auf Heap zuordnen müssen, verwenden Sie std :: shared_ptr, um sie einzuhüllen:

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

Sobald alle Kopien von my_string den Gültigkeitsbereich verlassen, wird der zugehörige Speicher automatisch gelöscht.

0
user4580891

behandeln Sie std :: string einfach als einen beliebigen Basistyp.

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