2016-05-09 3 views
1

Was passiert, wenn die zugrunde liegende Variable, auf die sie sich bezieht, gelöscht wird?Löschen der zugrunde liegenden Referenz

für z.B. warum unter Code 12 als Ausgabe geben geprüft i sowohl auf gcc und msvc

int *x = new int(1); 
int& y = *x; 
delete x; 
x=NULL; 
int z = 12; 
y=z; 
cout<<"Y = "<<y<<endl; 
+2

Das Verhalten ist nicht definiert. –

Antwort

4

ein Objekt, dessen Speichers Zugriff gelöscht worden ist undefiniertes Verhalten, unabhängig davon, ob Sie sie tun direkt oder durch eine Referenz.

Die Tatsache, dass der Code gibt 12 auf GCC und MSVC ist weitgehend irrelevant: es könnte Ausgang 13 oder 42 oder potato und nach wie vor Standard-konformer sein.

+3

Als ich heute Morgen aufwachte, stand 'Potato' in Blut auf meinem Badezimmerspiegel. Ich hatte Angst, bis ich dieses Q & A sah. Jetzt weiß ich, dass es nur ein Ergebnis von Kapils Zeitreise UB war! Puh! –

+0

Die Kartoffel hat meinen Tag gemacht: D –

0

Sie greifen auf den Speicher zu, nachdem Sie ihn freigegeben haben. Das ist undefiniert. "Undefined" bedeutet nicht, dass das Programm abstürzt, oder dass verschiedene Dinge in verschiedenen Läufen passieren. Es bedeutet lediglich, dass alles passieren könnte.

Leider, wenn Sie den Speicher zugreifen, der gerade freigegeben hat, in der Regel nichts Schlimmes passieren wird. Dies ist genau das Verhalten, das Sie sehen. Ich vermute, dass das gleiche in MSVC im Debug-Modus versuchen wird, in der Tat, geben Sie ein anderes Ergebnis, da es einige Modi hat, in denen es den Inhalt des dynamischen Speichers zerstört, sobald es freigegeben wird.

Auf Linux, versuchen Sie Valgrind (nachschlagen) oder die Adresse Sanitizer (Kompilieren mit -sanitize = Adresse). Beide fangen diese Art von Fehlern ein.