2012-06-30 13 views
5

Mientras respondía this question me confundí un poco. Todos sabemos que esto funciona bien debido a la semántica de copia de C++:Objetos en el montón y referencias

int *some_obj = new int(42); 
int a_copy = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_copy); 

Pero, ¿qué tal esto?

int *some_obj = new int(42); 
int& a_ref = *some_obj; 

delete some_obj; 

printf("The answer is %d\n", a_ref); 

¿Está accediendo a la memoria eliminada?

Probablemente me lo pidieron varias veces en varias formas, pero esto no es muy amigable para Google. Demonios, no podría hacer un título decente.

Respuesta

4

Sí, lo es. Entonces eso no está permitido. (Puede asegurarse de ver la diferencia usando una clase con un destructor que cambie el valor.)

+0

Ahora que leí una parte de la página de Wikipedia, lo explica muy claramente en el último párrafo de [esta sección] (http://en.wikipedia.org/wiki/Reference_ (C% 2B% 2B)) #Relationship_to_pointers). ¿Qué pasa con el retorno de referencias a los temporales (A es una clase aleatoria) 'A & func() {return A(); } '? – orlp

+0

Eso tiene el mismo problema. Está devolviendo una referencia a un objeto que ya no existe cuando la persona que llama lo recibe. –

+0

Muy bien, gracias por explicarme. – orlp

1

Exactamente. El segundo ejemplo accede a la memoria liberada. La implementación de referencias es punteros. Muy simple. La referencia es un puntero que no se puede cambiar y tiene una notación diferente del operador de acceso. No hay otra diferencia entre ellos.

Cuestiones relacionadas