109 votes

Est-ce qu'il est encore possible de supprimer des nullptr en c++0x ?

En c++03 il est assez clair que la suppression d'un pointeur nul n'a aucun effet. En effet, il est explicitement indiqué dans §5.3.5/2 que :

Dans les deux cas, si la valeur de l'opérande de suppression est le pointeur nul, l'opération n'a aucun effet.

Toutefois, dans le cadre de l'actuelle projet para c++0x cette phrase semble manquer. Dans le reste du projet, je n'ai trouvé que des phrases indiquant ce qui se passe si l'opérande de la fonction supprimer l'expression n'est pas la constante du pointeur nul. La suppression du pointeur nul est-elle toujours définie dans la norme c++0x et si oui, où ?

Notes :

De nombreuses preuves circonstancielles suggèrent qu'il est encore bien défini.

Tout d'abord, il y a les deux phrases de §5.3.5/2 déclarant que

Dans la première alternative (supprimer l'objet), la valeur de l'opérande de suppression peut être une valeur de pointeur nulle, ...

y

Dans la seconde alternative (supprimer le tableau), la valeur de l'opérande de suppression peut être une valeur de pointeur nulle ou ...

Elles indiquent que l'opérande peut être nul, mais ne définissent pas ce qui se passe s'il l'est.

Deuxièmement, la modification du sens de l'expression delete 0 est un changement majeur, et il est très peu probable que le comité de normalisation apporte ce changement particulier. En outre, l'annexe sur la compatibilité (annexe C) de la norme c++0x projet. L'annexe C est toutefois une section informative, qui n'a donc aucune incidence sur l'interprétation de la norme.

D'autre part, le fait que la suppression du pointeur nul doive être sans effet implique une vérification supplémentaire au moment de l'exécution. Dans de nombreux codes, l'opérande ne peut jamais être nul, de sorte que cette vérification à l'exécution est en conflit avec le principe de l'absence de frais généraux. Peut-être que le comité a simplement décidé de modifier le comportement afin de rendre le C++ standard plus conforme aux objectifs de conception déclarés du langage.

126voto

interjay Points 51000

5.3.5/7 dit :

Si la valeur de l'opérande de l'expression de suppression n'est pas un pointeur nul, l'expression de suppression appellera une fonction de désallocation (3.7.4.2). Dans le cas contraire, il n'est pas précisé si la fonction de désallocation sera appelée.

Et 3.7.4.2/3 dit :

La valeur du premier argument fourni à une fonction de désallocation peut être un pointeur nul ; si c'est le cas, et si la fonction de désallocation est fournie dans la bibliothèque standard, l'appel n'a aucun effet.

Le comportement est donc bien défini, tant que la fonction de désallocation standard est utilisée, ou qu'une fonction de désallocation fournie par l'utilisateur gère correctement les pointeurs nuls.

10voto

David Hammen Points 17912

D'autre part, le fait que la suppression du pointeur nul doive être sans effet implique une vérification supplémentaire au moment de l'exécution.

La nouvelle formulation ne supprime pas la vérification de l'existence d'un pointeur nul au moment de l'exécution. Dans l'autre sens : le projet de norme est encore plus proche de dire qu'une implémentation debe faire un test de pointeur nul pour être conforme.

À noter également : L'ancienne norme se contredisait en disant (5.3.5/2) que "si la valeur de l'opérande de delete est le pointeur nul, l'opération n'a pas d'effet", mais elle disait plus tard (5.3.5/7) que "l'expression delete appellera une fonction de désallocation". L'appel d'une fonction est un effet. C'est d'autant plus vrai que la fonction appelée pourrait bien être une fonction de type operator delete .

La nouvelle formulation supprime cette contradiction, en laissant explicitement à l'implémentation le soin d'appeler ou non la fonction de désallocation dans le cas de la suppression d'un pointeur nul.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X