Norme c++: déréférencement du pointeur NULL pour obtenir une référence?

Je me demande ce que dit le standard C++ à propos du code comme ceci:

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

En pratique, le résultat est que ptr2 est nul mais je me demande, est-ce juste un détail d'implémentation ou est-ce bien défini dans la norme?
Dans différentes circonstances, un déréférencement D'un pointeur NULL devrait entraîner un plantage, mais ici, je le déréférencement pour obtenir une référence qui est implémentée par le compilateur en tant que pointeur, donc il n'y a vraiment pas de déréférencement réel de NULL.

32
demandé sur shoosh 2010-04-28 12:28:59

5 réponses

Le déréférencement d'un pointeur NULL est un comportement indéfini.

En fait, la norme appelle cette situation exacte dans une note (8.3.2 / 4 "Références"):

Note: en particulier, une référence nulle ne peut pas exister dans un programme bien défini, car la façon de créer une telle référence serait de la lier à "l'objet" obtenu en déréférençant un pointeur nul, ce qui provoque un comportement indéfini.


En aparté: la seule fois que je suis conscient de cela un pointeur NULL peut être "déréférencé" d'une manière bien définie est comme l'opérande à l'opérateur sizeof, parce que l'opérande à sizeof n'est pas réellement évalué (donc la déréférence ne se produit jamais réellement).

44
répondu Michael Burr 2010-04-28 08:50:06

Le déréférencement d'un pointeur NULL est un comportement explicitement indéfini dans la norme C++, donc ce que vous voyez est spécifique à l'implémentation.

Copie à partir du 1.9.4 dans le projet de norme C++0x (similaire aux normes précédentes à cet égard):

Certaines autres opérations sont décrites dans cette norme internationale comme non défini (par exemple, l'effet de déréférencer le pointeur null). [Note : cette norme internationale n'impose aucune exigence sur le comportement des programmes qui contiennent comportement indéfini. - note de fin ]

2
répondu Gorpik 2010-04-28 09:55:59

Le déréférencement d'un pointeur NULL est un comportement indéfini. Vous devriez vérifier si une valeur est NULL avant de la déréférencer.

1
répondu Goz 2010-04-28 08:33:17

Pour être complet, ceci: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 parle spécifiquement de cette question.

1
répondu shoosh 2010-04-28 09:03:34
int& ref = *ptr;

L'instruction ci-dessus ne déréférence rien. Donc, il n'y a pas de problème jusqu'à ce que vous utilisiez le ref (qui est invalide).

-2
répondu valdo 2010-04-28 12:20:27