8
votes

Pourquoi la suppression du pointeur NULL est-il autorisé en C ++

Je me souviens de lire quelque part qu'il est nécessaire pour Suppr Null pour être une opération valide en C ++, mais je ne peux pas me rappeler la raison pour laquelle il devrait l'être. Est-ce que quelqu'un me rappelle s'il te plait?


1 commentaires

Une autre façon de regarder c'est inverser la question; Vous pouvez garantir que NULL ne pointe jamais quelque chose, vous préféreriez-vous donc si Supprimer NULL a jeté une exception? - ou même pire, s'il était laissé non défini par la norme et ouvert au comportement incohérent entre différents compilateurs?


7 Réponses :


14
votes

raison exacte:

  • Parce que le comité standard C ++ décida donc.

    raisonnement possible:

    • Parce que ce serait trop de code de code bloat pour vérifier chaque pointeur pour NULL avant d'appeler Supprimer dans le code de l'utilisateur.

0 commentaires

1
votes

Suppression d'un pointeur NULL n'a aucun effet (si la fonction de distribution est fournie dans la bibliothèque standard [2]), il n'est donc pas nécessaire de vérifier un pointeur NULL avant d'appeler Suppr.

Vérifiez également est-il sûr de supprimer un pointeur NULL? cela peut vous aider


0 commentaires

11
votes

La règle n'est pas strictement nécessaire en ce que la langue pourrait être existe sans elle; C'est simplement une décision prise par le Comité des normes. Le pointeur NULL n'est pas une adresse mémoire valide. Cependant, je voudrais croire que chaque décision est prise pour une raison, et ces raisons valent la peine de savoir.

Cette règle simplifie la gestion des cas d'échec et d'autres instances dans lesquelles un pointeur peut être nul. C'est un chèque facile et peu coûteux à faire, et il ajoute une commodité appréciable à la langue.

Par exemple, si de nombreuses conditions n'existent pas une allocation de mémoire dynamique, mais d'autres existent également, ce qui n'existe pas, mais Pratique pour pouvoir simplement coller un Supprimer à la fin et ne pas vous inquiéter de celui-ci. xxx

si Supprimer nullptr Étaient illégal alors chaque appel à Supprimer serait entouré de ... xxx

... et ce serait boiteux. Comme ce serait la norme, une convention essentiellement obligatoire, pourquoi ne pas simplement éliminer la nécessité de vérifier entièrement? Pourquoi avoir besoin de 5 caractères supplémentaires (minimum) pour chaque appel à Supprimer ?


7 commentaires

@LuchianGriggore: Il est possible que j'ai eu au moins sept verres de vin sur ce merveilleux vendredi soir ... J'ai écrit Supprimer n n'est-ce pas? :RÉ


ne sont-ils pas là des plateformes sur lesquelles 0 est une adresse de mémoire valide?


@stijn: 0 est défini pour ne jamais être une adresse valide, donc non.


seulement pour C ++ alors? Je suis à peu près sûr que j'ai vu des plates-formes DSP où la mémoire interne commence à 0, mais c'était en C. ou peut-être qu'ils ne sont tout simplement pas conformes.


@stijn: Les langages C et C ++ garantissent que 0 n'est jamais une adresse de mémoire valide. Comment un compilateur donné implémente que pour une plate-forme donnée est, bien, la mise en œuvre définie. La plupart des systèmes d'exploitation garantissent que 0 n'est jamais renvoyé comme une adresse de mémoire valide à un programme (ne signifie pas qu'ils ne font tous).


@stijn: J'ai besoin de me corriger; Un pointeur nul doit toujours être invalide. Le pointeur nul ne doit pas nécessairement être 0 . NULL est une macro qui est définie comme étant 0 dans C. La langue elle-même parle en termes de null pointeur et de sa sémantique. En pratique, ils sont généralement un de même, mais ils n'ont pas besoin d'être. Je devais vérifier la norme: D


Sous Linux, il était possible de faire 0 une adresse mémoire valide, mais elle est désactivée par défaut pour des raisons de sécurité. Mais c'est toujours utile et utilisé par le vin lors de la gestion de programmes MS-DOS.



2
votes

Parce que le comité standard sache que NO Program peut avoir NULL pour pointer à un objet valide, c'est-à-dire que NULL ne peut pas indiquer une mémoire valide, il est donc sûr d'écrire Supprimer null , précisément parce que cela ne réellement supprime quoi que ce soit. Comme cela est sûr, cela vous permet de rechercher la nécessité de rechercher NULL, avant Supprimer : xxx


0 commentaires

0
votes

Eh bien, je me souviens clairement que les règles de suppression de pointer-to- const (maintenant OK) ont été modifiées avec la normalisation, c'est-à-dire qu'ils étaient différentes dans le bras, le manuel de référence annoté.

Mais je ne suis pas sûr de la suppression de 0; Je pense que c'est toujours soutenu.

Quoi qu'il en soit, il s'agit simplement de commodité , pour une opération où le coût de la vérification est insignifiant et où il peut être fait / probablement fait plus efficacement par le compilateur que par une fonction d'emballage définie par l'utilisateur pour Suppression.


0 commentaires

3
votes

Tout d'abord, null n'est jamais une valeur de pointeur valide (dans un programme hosté C ++), et il n'y a donc aucune ambiguïté quant à savoir si le pointeur pointe vers un objet en direct ou non. Deuxièmement, la logique de gestion de la mémoire interne doit faire sa propre vérification de toute façon pour effectuer la comptabilité, donc vraisemblablement rien ne serait gagné de mandater que le pointeur soit non null.

Nous savons que rien ne parle contre < / EM> Cette règle, voici le gros argument en sa faveur: il est beaucoup plus facile d'écrire du code. Considérez cette simple manipulation d'exception de code d'allocation: xxx

C'est simple et épuré. Si nous devions ajouter des chèques nuls partout, cela rendrait le code beaucoup moins lisible et obscurcirait la logique du code.


0 commentaires

2
votes

Parce que l'implémentatrice de la bibliothèque doit simplement écrire si (ptr == nullptr) retourner; une fois. Vous, l'utilisateur, devriez vous écrire 9999999999 fois tout au long de votre programme. Ainsi, c'est un cas simple qui le fait à l'intérieur suppression est beaucoup plus simple.


0 commentaires