2017-09-07 5 views
1

ich eine verknüpfte Liste der Umsetzung, bis ich überPointers in einer verknüpften Liste Beispiel

kam
void StringLinkedList::removeFront(){ 

StringNode *old = head; 
head = old -> next; 
delete old; 

} 

Ich frage mich, warum nicht nur Kopf tun = Kopf-> weiter (statt head = Old-> next), Wie erzeugt dies einen Speicherverlust, wenn nichts auf die vorherige Adresse zeigt (da head der head-Knoten jetzt auf den nächsten Knoten zeigt).

Vielen Dank.

+0

Wenn Sie noch diese 3 Zeilen haben, aber in der zweiten Zeile alt zu Kopf ändern - der Code wird gleich sein und kein Speicherleck wird eingeführt. –

Antwort

4

C++ hat keine automatisierte Garbage Collection wie einige andere Sprachen, die Speicher freigeben, sobald sie nicht mehr referenziert werden. Dafür gibt es eine Reihe von Gründen, und eine Diskussion zu diesem Thema finden Sie unter Why doesn't C++ have a garbage collector?.

Dies bedeutet, dass new Ed muss delete d oder Sie haben ein Leck.

Sagen Sie bitte

enter image description here

haben Wenn Sie den ursprünglichen Wert von head vor head Überschreiben nicht delete tun,

enter image description here

die Adresse des Knotens 1 nicht mehr bekannt, so dass es ist fast unmöglich, die Zuordnung zu delete es zu finden. Dies erzwingt ein Leck.

Aber wenn Sie delete head, bevor es erneut zeigen,

enter image description here

Sie können nicht head->next auf den nächsten Knoten, und Sie verlieren und die ganze Liste auslaufen.

Wenn Sie jedoch eine temporäre Kopie der Adresse head machen,

enter image description here

old in diesem Fall können Sie sicher wieder Punkt head

enter image description here

und noch haben Sie die Adresse der Zuordnung, die Sie benötigen, um delete in old gespeichert.

+0

der Code, den ich mir angesehen habe, hat keinen Kopf mit 'neu' erstellt, obwohl das ein Fehler ist? – coder666

+0

@ coder666 Sie löschen nicht wirklich 'Kopf'. Sie löschen, was "head" zeigt. "head" kann auf einen beliebigen "Node" zeigen, und wenn "head" auf einen "node" zeigt, der durch "new" erstellt wurde, muss jemand früher oder später "löschen". Stichwort: "Besitz-Semantik". In diesem Fall ist die verknüpfte Liste der Eigentümer des 'Node' und' head' ist, wo die verknüpfte Liste den Verweis auf den 'Node' speichert. Wie für "Kopf" selbst, ist es eine automatische Variable, die für Sie erledigt wird, wenn es außerhalb des Geltungsbereichs geht. – user4581301

+0

Ich verstehe es! Vielen Dank ! – coder666

Verwandte Themen