web-dev-qa-db-fra.com

Existe-t-il une raison de rechercher un pointeur NULL avant de supprimer?

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?

48
yesraaj

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. 

66
Randolpho

Supprimer les contrôles pour NULL en interne. Votre test est redondant

9
EvilTeach

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.

7
Welbog

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.

4
Lingxi

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)

3
Joe

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.

1
VoidPointer

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.

0
Joe Pineda