Löscht einen Zeiger auf eine automatische Variable [Duplikat]
-
30-09-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
Bitte schauen Sie in diesem Code
int i = 10; //line 1
int *p = &i; //line 2
delete p; //line 3
cout << "*p = " << *p << ", i = " << i << endl; //line 4
i = 20; //line 5
cout << "*p = " << *p << ", i = " << i << endl; //line 6
*p = 30; //line 7
cout << "*p = " << *p << ", i = " << i << endl; //line 8
Was ist das Ergebnis dieser Code? Besonders die Leitung 3, 5 und 7? Haben sie nicht definiertes Verhalten aufrufen? Was wäre der Ausgang sein?
EDIT: Ich habe versucht, es läuft mit g ++, und es ist Kompilieren und Ausführen in Ordnung! Ich bin mit MinGW auf Windows 7.
Was ist Standard in diesem Zusammenhang sagen?
Lösung
Sie können nur einen Zeiger löschen, wenn Sie es jemals dynamisch neue Verwendung zugeteilt. In diesem Fall haben Sie den Zeiger mit neuen, aber einfach nicht definiert zugewiesen und initialisiert es zu Punkt auf eine lokalen Variable vom Typ int.
Aufrufen auf einem Zeiger löschen nicht dynamisch neu zugewiesenen mit so etwas genannt wird undefinierten Verhalten . Kurz gesagt, bedeutet es, dass alles auf der Erde passieren kann, wenn ein solcher Code ausgeführt wird, und Sie können nicht Beschwerde ein wenig jemand auf diesem Planeten.
Andere Tipps
delete p;
ist UB und so weiter Verhalten nicht vorhergesagt werden kann, oder als Grundlage. Sie Programm könnte sofort abstürzen oder alle Ihr Geld oder einfach nur Ausfahrt verbringen von main()
und so tun, es ist nichts passiert.
Zeile 3 ist definitiv nicht definiertes Verhalten, da Sie versuchen, Speicher an einer Adresse zu löschen, die nicht auf dem Heap ist.