Je me souviens de lire quelque part qu'il est nécessaire pour Suppr Null code> 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? P>
7 Réponses :
Supprimer code> dans le code de l'utilisateur. LI>
ul>
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. P>
Vérifiez également est-il sûr de supprimer un pointeur NULL? a> cela peut vous aider p>
La règle n'est pas strictement nécessaire en ce que la langue pourrait être em> 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. P> 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 si ... 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 code> à la fin et ne pas vous inquiéter de celui-ci. p>
Supprimer nullptr code> Étaient illégal alors chaque appel à
Supprimer code> serait entouré de ... p>
Supprimer code>? p> p>
@LuchianGriggore: Il est possible que j'ai eu au moins sept verres de vin sur ce merveilleux vendredi soir ... J'ai écrit Supprimer n code> n'est-ce pas? :RÉ
ne sont-ils pas là des plateformes sur lesquelles 0 code> est une adresse de mémoire valide?
@stijn: 0 code> 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 code> 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 code> 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 code>.
NULL code> est une macro qui est définie comme étant
0 code> dans C. La langue elle-même parle en termes de null pointeur i> 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.
Parce que le comité standard sache que Supprimer null code >, précisément parce que cela ne réellement em> supprime quoi que ce soit. Comme cela est sûr, cela vous permet de rechercher la nécessité de rechercher NULL, avant
Supprimer code>:
Eh bien, je me souviens clairement que les règles de suppression de pointer-to- Mais je ne suis pas sûr de la suppression de 0; Je pense que c'est toujours soutenu. P>
Quoi qu'il en soit, il s'agit simplement de commodité em>, 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. P> const code> (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é. p>
Tout d'abord, 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: p> 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. P> P> null code> 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.
Parce que l'implémentatrice de la bibliothèque doit simplement écrire si (ptr == nullptr) retourner; code> 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 code> est beaucoup plus simple. P>
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 code> 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?