web-dev-qa-db-fra.com

Est-il prudent de supprimer un pointeur NULL?

Est-il prudent de supprimer un pointeur NULL?

Et est-ce un bon style de codage?

276
qiuxiafei

delete effectue quand même le contrôle, aussi, le vérifier de votre côté ajoute un surcoût et semble plus laid. Une bonne pratique très définit le pointeur sur NULL après delete (évite la double suppression et d'autres problèmes de corruption de mémoire similaires).

J'aimerais aussi si delete par défaut définissait le paramètre sur NULL comme dans

#define my_delete(x) {delete x; x = NULL;}

(Je connais les valeurs de R et L, mais cela ne serait-il pas agréable?)

241
ruslik

À partir du projet de norme C++ 0x.

$ 5.3.5/2 - "[...] Dans les deux cas, la valeur de l'opérande de suppression peut être une valeur de pointeur nulle. [... '"

Bien sûr, personne ne ferait jamais "supprimer" un pointeur avec la valeur NULL, mais c'est sûr. Idéalement, il ne devrait pas y avoir de code supprimant un pointeur NULL. Mais cela est parfois utile lorsque la suppression de pointeurs (par exemple dans un conteneur) se produit dans une boucle. Étant donné que la suppression d'une valeur de pointeur NULL est sécurisée, on peut réellement écrire la logique de suppression sans vérification explicite de l'opérande NULL à supprimer.

En passant, C Standard $ 7.20.3.2 indique également que "libre" sur un pointeur NULL ne fait aucune action.

La fonction free provoque la désallocation de l’espace pointé par ptr, c’est-à-dire qu'elle est disponible pour une allocation ultérieure. Si ptr est un pointeur nul, aucune action ne se produit.

73
Chubsdad

Oui c'est sûr.

Il n'y a pas de mal à supprimer un pointeur nul; il réduit souvent le nombre de tests à la fin d'une fonction si les pointeurs non alloués sont initialisés à zéro puis simplement supprimés.


Étant donné que la phrase précédente a semé la confusion, voici un exemple - sans exception - de ce qui est décrit:

void somefunc(void)
{
    SomeType *pst = 0;
    AnotherType *pat = 0;

    …
    pst = new SomeType;
    …
    if (…)
    {
        pat = new AnotherType[10];
        …
    }
    if (…)
    {
        …code using pat sometimes…
    }

    delete[] pat;
    delete pst;
}

Il y a toutes sortes de lentes qui peuvent être sélectionnées avec l'exemple de code, mais le concept est (j'espère) clair. Les variables de pointeur sont initialisées à zéro de sorte que les opérations delete à la fin de la fonction n'ont pas besoin de tester si elles sont non nulles dans le code source; le code de la bibliothèque effectue quand même cette vérification.

44
Jonathan Leffler

La suppression d'un pointeur nul n'a aucun effet. Ce n'est pas nécessairement un bon style de codage parce que ce n'est pas nécessaire, mais ce n'est pas mal non plus.

Si vous recherchez de bonnes pratiques de codage, envisagez plutôt d'utiliser des pointeurs intelligents, vous n'avez donc pas besoin de delete.

20
Brian R. Bondy

Pour compléter la réponse de ruslik, vous pouvez utiliser cette construction en C++ 14:

delete std::exchange(heapObject, nullptr);
5
ashrasmun

Il est sûr sauf si vous surchargez l'opérateur de suppression. si vous avez surchargé l'opérateur de suppression et que vous ne gérez pas la condition null, cela n'est pas du tout sûr.

3
user4016479

J'ai constaté qu'il était pas sûr (VS2010) de supprimer [] NULL (c'est-à-dire la syntaxe d'un tableau). Je ne suis pas sûr que cela soit conforme à la norme C++.

Il est sûr de supprimer NULL (syntaxe scalaire).

0
pheest