Lassen Sie mich die Wörter aus dem Operator löschen in cplusplus.com ausleihen:
Löscht den Speicherblock, auf den ptr (wenn nicht null) zeigt, los der Speicherplatz, der ihm zuvor durch einen Aufruf von operator new zugewiesen wurde und diese Zeigerposition ungültig zu machen.
Bitte helfen Sie meine Verwirrungen zu löschen: Was passiert mit dem Zeiger selbst nach dem Löschen? Der Zeiger selbst hat eine Adresse, richtig? Also, nachdem der spitze Block gelöscht wurde, was ist mit dem Zeiger selbst?
Kann ich sagen, dass der Zeiger selbst nach dem Zurückgeben der Methode, in der der Zeiger initialisiert wird, frei ist? Ist der Zeiger selbst auf dem Stapel oder Heap platziert?
Der Zeiger selbst hat eine Adresse und den Wert. Die Adresse des Zeigers ändert sich nicht, nachdem Sie delete
darauf ausgeführt haben. Der der Zeigervariable selbst zugewiesene Platz bleibt an seinem Platz, bis Ihr Programm ihn freigibt (was er möglicherweise nie tun würde, beispielsweise wenn sich der Zeiger im statischen Speicherbereich befindet). Der Standard sagt nicht, was mit dem Wert des Zeigers passiert; Alles, was es sagt, ist, dass Sie diesen Wert nicht mehr verwenden dürfen, bis Sie Ihrem Zeiger einen gültigen Wert zugewiesen haben. Dieser Status des Zeigers wird dangling genannt.
In Ihrem Programm hängt der Zeiger ptr
, nachdem delete
abgeschlossen wurde, aber bevor die ptr = NULL
Zuweisung ausgeführt wird. Danach wird es ein NULL
-Zeiger.
Der Zeiger selbst ist auf Stapel oder Heap platziert?
Zeigervariable ist eine reguläre Variable. Seine Platzierung folgt den gleichen Regeln wie die Platzierung anderer Variablen, dh Sie können einen Zeiger in einen statischen Bereich, in einen automatischen Bereich (allgemein bekannt als "der Stapel") oder in den dynamischen Speicher (auch bekannt als "der Haufen") setzen ). In diesem Fall weisen Sie einem Zeiger einen Zeiger zu:
%Vor%In C und C ++ kann man sich einen Zeiger auf vielerlei Weise nur als verkleidete Ganzzahl vorstellen. Also wenn du sagst:
%Vor% Dann ist ptr
genau wie eine stack-allozierte ("automatische") Integer-Variable, die zufällig groß genug ist, um die Speicheradresse des Heap-allocated TheObject
zu halten. Es ist ähnlich wie gesagt
Später, wenn Sie
schreiben %Vor%es hat eine identische Bedeutung wie:
%Vor% Was passiert mit dem -Zeiger , wenn Sie die Funktion verlassen? Wie bei jeder anderen automatischen Variable wird sie am Ende des Blocks aufgehoben. So einfach ist das. (Natürlich wird das Ding, auf das gezeigt wird, solange weiterlaufen, bis Sie delete
oder free()
in C aufrufen.)
Die Ausführung von delete
macht den Zeiger ungültig (siehe [new.delete.single]#10
). Man könnte sagen, dass der Wert geändert wurde: Vorher hatte es einen Wert, aber jetzt hat es keinen Wert.
Der Versuch, den Wert des Zeigers zu lesen (Anmerkung: Dies ist anders als bei der Dereferenzierung), verursacht implementierungsdefiniertes Verhalten seit C ++ 14, was das Generieren eines Laufzeitfehlers beinhalten kann. (In C ++ 11 und älteren Standards war es undefiniertes Verhalten). Ref: [basic.stc.dynamic.deallocation]#4
.
Es wäre legal, wenn der Compiler auch den Zeiger auf Null setzt oder ihn für Debuggingzwecke auf einen erkennbaren Müll setzt (obwohl ich keine Compiler kenne, die das tun).