Erneute Zuweisung von Speicher über "neu" in C ++

8

Schnelle Frage zur Speicherverwaltung in C ++

Wenn ich folgende Operation mache:

%Vor%

Und dann führe es erneut aus, wobei vielleicht ein anderes Ergebnis von strlen(someinput_input) zurückgegeben wird.

Führt dies dazu, dass der Speicher von der vorherigen " new " Anweisung reserviert bleibt? Wie in, wird jede new Anweisung einen weiteren HEAP Speicherblock vom Betriebssystem empfangen, oder wird sie einfach neu zugeordnet?

Angenommen, ich mache eine letzte delete pointer[]; wird die Zuordnung aller und Speicher, die ich jemals zugewiesen über new auf diesen Zeiger?

    
BSchlinker 01.04.2010, 02:54
quelle

8 Antworten

9

Jeder Aufruf von new muss mit einem entsprechenden Aufruf von delete übereinstimmen.

Abgesehen davon sollten Sie in Betracht ziehen, std::string oder sogar std::vector<char> (abhängig von der genauen Situation), anstatt zu versuchen, char-Arrays selbst zuzuweisen. Dann brauchst du dir keine Sorgen zu machen.

    
Dean Harding 01.04.2010, 02:57
quelle
7

Wenn Sie "that pointer" sagen, ist es wichtig zu verstehen, dass sich der Wert von "that pointer" mit jeder Zuweisung ändert. Nach einer Zuweisung ist es vielleicht 0x100234 und nach der nächsten Zuweisung ist es 0x104234. Das heißt, wenn Sie einen Zeiger auf eine neue Adresse (einen neuen Speicherblock) neu zuweisen, ohne den alten Block zu löschen (delete [] ing), verlieren Sie für die Dauer des Prozesses Speicher.

    
warrenm 01.04.2010 02:57
quelle
6
  

Führt dies dazu, dass Speicher von der vorherigen "neuen" Anweisung reserviert bleibt?

Ja, dies wird als Speicherleck bezeichnet.

  

IE, erhält jede neue Anweisung einen weiteren HEAP-Speicherblock vom Betriebssystem oder wird sie einfach neu zugeordnet?

Es ist ein neuer Speicherblock vom Heap.

  

Angenommen, ich mache einen letzten Löschzeiger []; Werden alle Speicher, die ich jemals zugewiesen habe, über diesen Zeiger freigegeben?

Wenn Sie "[] pointer;" löschen, wird der Speicher, auf den er zeigt, freigegeben. Nur der Speicher vom letzten "new char []" call.

    
Stephen 01.04.2010 02:59
quelle
2

Es wird dein Gedächtnis baumeln lassen. Sie müssen den Befehl delete [] aufrufen, bevor Sie den Operator 'new' erneut für denselben Zeiger verwenden (es sei denn, Sie haben diese Adresse einem anderen Zeiger zugewiesen).

    
Jordan Parmer 01.04.2010 02:57
quelle
2

Ein Zeiger ist einfach eine Variable, die eine Speicheradresse enthält. Es führt keine implizite Referenzzählung durch.

Jede neue Anweisung [] gibt die Adresse des ersten Elements im Puffer zurück. Wo Sie diese Adresse speichern, oder auch wenn Sie sie überhaupt speichern, spielt keine Rolle.

Der Speicher wird nur dann freigegeben, wenn Sie delete [].

aufrufen

In C ++ gibt es keine automatische Referenzzählung / automatisches Löschen. Wenn Sie eine andere Zuordnung vornehmen, wird die alte nicht freigegeben.

    
Brian R. Bondy 01.04.2010 02:57
quelle
2

Kurz gesagt: Jedes Mal, wenn Sie neu anrufen, vergeben Sie neuen Speicher vom Heap. Es gibt keine Magie in C ++, die sich daran erinnert, was Sie dem Zeiger zugewiesen haben.

    
goldsz 01.04.2010 02:57
quelle
2

Jede new ist eine andere Zuweisung. Wenn Sie das Ergebnis der gleichen Zeigervariablen ohne delete in der Mitte zuweisen, geht der Speicher verloren, d. H. Sie haben sich ein Speicherleck geholt.

    
Nikolai Fetissov 01.04.2010 02:58
quelle
1

Wie bereits erwähnt, muss das neue ahs mit einem delete übereinstimmen. ABER wenn Sie stdlibs malloc / free verwenden können, gibt es eine Realloc-Funktion: cplusplus.com

    
user1228651 18.10.2012 14:09
quelle