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.
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).
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 ]
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.
Pour être complet, ceci: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 parle spécifiquement de cette question.
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).