Verknüpfte Liste Destruktor
Studiere ich C++ auf meine eigene Zeit, und schreiben Sie eine verknüpfte Liste, um zu versuchen und erhalten Sie den Dreh. Ich bin besorgt über die Art und Weise habe ich um das Objekt zu löschen. Es ist eine einfach verkettete Liste. Hier ist der Destruktor:
template <typename T>
LinkedList<T>::~LinkedList()
{
Node<T> * current = this->first;
do {
Node * temp = current->next;
delete current; //THIS JUST MIGHT BE A TERRIBLE IDEA!!!
Node * current = temp; //new current-- might work with the current
//delete a line above
} while (current->next != 0); //need to leave this->last so that I don't
//delete it twice in the next line.
//Just realized I'm deleting this->first, then
//in the next line [implicitly] deleting it again!
//
delete this;
}
Ich erstelle einen Zeiger auf den ersten Knoten in der Liste, erstellen Sie einen temporären Zeiger auf den nächsten Knoten, löschen Sie den ersten Zeiger, erstellen Sie einen neuen Zeiger mit dem gleichen Namen, die dann in einer Schleife zurück. Nachdem es fertig ist, löscht er die "this" - Zeiger.
Ich bin sicher, Sie können sehen, warum ich bin besorgt, mit der Möglichkeit, die ich erstellen Sie einen neuen Zeiger mit dem gleichen Namen wie eine gelöschte Zeiger.
- was ist Ihre Frage?
- oops. Ich würde gerne wissen, wenn Sie einen Zeiger, es zu löschen, dann eine neue mit dem gleichen Namen in einer Schleife koscher ist.
- watch out, werden die tabs nicht gut mit Markdown. Ich nahm mir die Freiheit zu reindent den code mit Leerzeichen nur.
Du musst angemeldet sein, um einen Kommentar abzugeben.
delete this
im Destruktor.Node
ist eine Vorlage, dann müssen Sie schreibenNode<T>
dass in all diesen Definitionen.current
, weisen Sie einfach es zu einem neuen Wert.Andere als das, ich sehe keine anderen Probleme in diesem snippet.
delete
, entweder Lesen Sie sich die Adresse innerhalb oder weisen Sie ihm einen neuen Wert, aber Sie können nicht verwenden, was es wies nach, weil es ausgelöscht wurde.Warum nicht den code zu kompilieren, versuchen Sie es, und sehen, was passiert? Das Schlimmste, was passieren würde, wäre, dass Ihr Programm abstürzt und Sie haben, um herauszufinden, warum.
Dein code sollte eigentlich funktionieren, außer dass Sie brauchen, um zu testen
current
in der while-Schleife Bedingung stattcurrent->next
und es ist überflüssig (und wahrscheinlich falsch) zu schreibendelete this
im Destruktor, und es gibt einige weitere Fehler, die Katze Plus Plus zeigte in seiner Antwort.Wenn Sie versuchen zu lernen, C++, dann sollten Sie lernen, mehr zu dem Punkt, wo Sie verstehen, die Fehler, die Sie hier gemacht und sind zuversichtlich, dass die korrigierten code funktioniert.
Hier ist meine verbesserte version der Funktion:
Ich sehe nicht die Frage, aber ich sehe viele Fehler:
Der richtige code ist:
delete this;
in ein Destruktor wird wie ein code-Selbstmord. Ihr Objekt ist bereits zerstört und Sie wieder zu zerstören mitdelete this;
. Es ist ein nicht definiertes Verhalten. Sie können zu entfernen. Rest der Dinge, die gut Aussehen (unter der Annahme, dassthis->first
gibt den KopfNode
).Bearbeiten: ich vermisste, dass Sie neu definiert haben
current
. Zu entfernen. (sollte einfachcurrent = temp;
)