Je vois souvent le code hérité en train de vérifier NULL
avant de supprimer un pointeur, similaire à,
if (NULL != pSomeObject)
{
delete pSomeObject;
pSomeObject = NULL;
}
Existe-t-il une raison de rechercher un pointeur NULL
avant de le supprimer? Quelle est la raison pour laquelle le pointeur est placé sur NULL
par la suite?
Il est parfaitement "sûr" de supprimer un pointeur nul; cela équivaut effectivement à un non-op.
La raison pour laquelle vous voudrez peut-être vérifier la valeur NULL avant de supprimer est que tenter de supprimer un pointeur NULL pourrait indiquer un bogue dans votre programme.
Supprimer les contrôles pour NULL en interne. Votre test est redondant
La suppression de null est une opération impossible. Il n'y a aucune raison de vérifier la valeur null avant d'appeler delete.
Vous voudrez peut-être vérifier la valeur null pour d'autres raisons si le pointeur à l'état null contient des informations supplémentaires qui vous intéressent.
Selon C++ 03 5.3.5/2, il est prudent de supprimer un pointeur null . Ce qui suit est tiré du standard
Dans les deux cas, si la valeur de l'opérande de suppression est le pointeur null l'opération n'a pas d'effet.
Si pSomeObject est NULL, la suppression ne fera rien. Donc non, vous n'avez pas à vérifier NULL.
Nous considérons qu'il est judicieux d'attribuer la valeur NULL au pointeur après l'avoir supprimé, s'il est tout à fait possible que certains partenaires puissent essayer d'utiliser le pointeur. Utiliser un pointeur NULL est légèrement préférable à un pointeur indiquant qui sait quoi (le pointeur NULL provoquera un blocage, le pointeur sur la mémoire supprimée peut ne pas l'être)
Il n'y a aucune raison de rechercher la valeur NULL avant la suppression . Attribuer la valeur NULL après la suppression peut être nécessaire si le code vérifie si un objet est déjà alloué en effectuant une vérification NULL. Un exemple serait une sorte de données en cache allouées à la demande. Chaque fois que vous effacez l'objet cache, vous affectez la valeur NULL au pointeur afin que le code qui alloue l'objet sache qu'il doit effectuer une allocation.
Je pense que le développeur précédent l'a codé "de manière redondante" pour économiser quelques millisecondes:
if(pSomeObject1!=NULL) pSomeObject1=NULL;
Mais alors supprimer fait quand même cette comparaison exacte (ne rien faire si c'est NULL). Pourquoi faire ça deux fois? Vous pouvez toujours affecter pSomeObject à NULL après l'appel de delete, quelle que soit sa valeur actuelle - mais cela serait légèrement redondant s'il possédait déjà cette valeur.
Mon pari est donc que l'auteur de ces lignes a essayé de s'assurer que pSomeObject1 serait toujours NULL après avoir été supprimé, sans entraîner le coût d'un test et d'une assignation potentiellement inutiles.