Pregunta Estándar de C ++: desmarcando el puntero NULL para obtener una referencia?


Me pregunto qué dice el estándar de C ++ sobre un código como este:

int* ptr = NULL;
int& ref = *ptr;
int* ptr2 = &ref;

En la práctica, el resultado es que ptr2 es NULL pero me pregunto, ¿es solo un detalle de implementación o está bien definido en el estándar?
En circunstancias diferentes, una eliminación de referencias de un puntero NULL debería provocar un bloqueo, pero aquí estoy desreferenciando para obtener una referencia que el compilador implementa como un puntero, por lo que no hay realmente una desreferenciación real de NULL.


32
2018-04-28 08:28


origen


Respuestas:


Desreferenciar un puntero NULL es un comportamiento indefinido.

De hecho, el estándar llama a esta situación exacta en una nota (8.3.2 / 4 "Referencias"):

Nota: en particular, una referencia nula no puede existir en un programa bien definido, porque el único   La forma de crear dicha referencia sería vincularla al "objeto" obtenido al eliminar la referencia de un puntero nulo, lo que causa un comportamiento indefinido.


Como comentario: La única vez que sé que un puntero NULL puede ser "desreferenciado" de una manera bien definida es como el operando al sizeof operador, porque el operando a sizeof en realidad no se evalúa (por lo que la desreferencia en realidad nunca ocurre).


44
2018-04-28 08:34



La desreferenciación de un puntero NULL es un comportamiento explícitamente indefinido en el estándar de C ++, por lo que lo que se ve es específico de la implementación.

Copia de 1.9.4 en el borrador del estándar C ++ 0x (similar a las normas anteriores a este respecto):

Se describen algunas otras operaciones   en esta norma internacional como   indefinido (por ejemplo, el efecto de   desreferenciando el puntero nulo).   [Nota: este estándar internacional   no impone requisitos en el   comportamiento de los programas que contienen   comportamiento indefinido - nota final]


2
2018-04-28 08:35



Desreferenciar un puntero NULL es un comportamiento indefinido. Debería verificar si un valor es NULL antes de desreferenciarlo.


1
2018-04-28 08:33



Para completar, esto: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 habla específicamente sobre este tema.


1
2018-04-28 09:03



int& ref = *ptr;

La declaración anterior en realidad no desreferencia nada. Así que no hay problema hasta que use el ref (que no es válido)


-2
2018-04-28 12:20