Se ha hecho evidente a través de un series of SO questions hoy que tengo una comprensión muy pobre de la verdadera naturaleza de los punteros, referencias y valores.Comprensión de referencias frente a punteros. ¿Por qué funciona esto?
Considere el siguiente código:
int* p = new int(3);
int& r = *p;
cout << " p = " << p << "\t*p = " << *p << endl;
cout << "&r = " << &r << "\t r = " << r << endl;
delete p;
cout << "&r = " << &r << "\t r = " << r << endl;
int v = 4;
r = v;
cout << "&r = " << &r << "\t r = " << r << endl;
La salida de esto es
p = 0x1001000b0 *p = 3
&r = 0x1001000b0 r = 3
&r = 0x1001000b0 r = 3
&r = 0x1001000b0 r = 4
Lo que no entiendo es por qué la segunda vez que se imprime el valor de la referencia que Don recibes un error El puntero correspondiente al valor de la referencia ya ha sido eliminado. Desde mi previous question, casi me había convencido de que cualquier declaración como r = x
hace una copia de x
en el lugar del valor que se refiere a r
. Sin embargo, si este fuera el caso, entonces las direcciones p
y &r
serían diferentes, ¿no? Si ya he llamado eliminar en 0x100100b0, ¿cómo puedo seguir usándolo?
Verdadero o falso: una referencia es lo mismo que un alias del valor en una dirección.
Verdadero o falso: Si elimina un puntero a la misma dirección como un valor de referencia reside, (como yo arriba), entonces no hay un comportamiento indefinido ocurrirá, y nadie va a sobrescribir esa dirección, siempre y cuando la referencia existe
Lo que ocurre con el comportamiento indefinido es que está perfectamente permitido que parezca funcionar bien. :) –
Verdadero, falso, y qué dijo @Karl. Este es un comportamiento indefinido que no se bloqueó esta vez. – aschepler
@ ustedes muchachos! Entonces creo que entiendo finalmente. – JnBrymn