1

an diesem Code suchen BitteLöschen eines Zeigers auf eine automatische Variable

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 das Ergebnis dieses Codes ist? Vor allem von Zeile 3, 5 und 7? Rufen sie unbestimmtes Verhalten auf? Was wäre die Ausgabe?

EDIT: Ich habe versucht, es mit g ++, und es ist kompilieren und läuft gut! Ich verwende MinGW unter Windows 7.

Was sagt Standard in diesem Zusammenhang?

+0

haben Sie versucht, es auszuführen? Vielleicht kannst du das Ergebnis deines Laufs hinzufügen und wir können es dann diskutieren? – Nim

+0

Warum nicht kompilieren und sehen? Ich bekomme einen segfault ... – Kricket

+0

'*** Fehler für Objekt 0x7fff5fbff5ec: Zeiger freigelassen wurde nicht zugeordnet *** setzen Sie einen Breakpoint in malloc_error_break zu debuggen, während es ausgeführt wird ... mit g ++ 4.1 in MacOS X kompiliert Meine Definition von "Laufen" läuft nicht gut. –

Antwort

5

Sie können nur einen Zeiger löschen, wenn Sie ihn dynamisch mit new zugewiesen haben. In diesem Fall haben Sie den Zeiger nicht mit new zugewiesen, sondern einfach definiert und initialisiert, um auf eine lokale Variable vom Typ int zu verweisen.

Das Aufrufen von delete auf einem nicht dynamisch zugewiesenen Zeiger mit new ist etwas, das Undefined Behavior aufgerufen wird. Kurz gesagt, es bedeutet, dass alles auf der Erde passieren kann, wenn ein solcher Code ausgeführt wird, und Sie können sich nicht ein bisschen bei irgendjemandem auf diesem Planeten beschweren.

+1

Nicht nur sollte Speicher dynamisch zugewiesen werden, es sollte nur mit 'new' zugewiesen werden. – sharptooth

+0

@sharptooth: ja, aktualisiert – Chubsdad

1

delete p; ist UB und so kann jedes weitere Verhalten nicht vorhergesagt werden. Sie Programm möglicherweise sofort abstürzen oder verbringen Sie Ihr ganzes Geld oder einfach nur aus main() und so tun, als wäre nichts passiert.

0

Zeile 3 ist definitiv undefiniertes Verhalten, da Sie versuchen, Speicher an einer Adresse zu löschen, die sich nicht auf dem Heap befindet.

+2

Warum wurde das abgelehnt, da es dasselbe wie das, das upvoted wurde, sagt? –