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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top