5 votes

Quelle version de safe_delete est meilleure?

#define SAFE_DELETE(a) if( (a) != NULL ) delete (a); (a) = NULL;

Ou

template void safe_delete(T*& a) {
  delete a;
  a = NULL;
}

ou toute autre meilleure façon

17voto

Je dirais ni l'un ni l'autre, car les deux vous donneront un faux sentiment de sécurité. Par exemple, supposez que vous avez une fonction :

void Func( SomePtr * p ) {
  // stuff
  SafeDelete( p );
}

Vous définissez p à NULL, mais les copies de p à l'extérieur de la fonction ne sont pas affectées.

Cependant, si vous devez le faire, allez avec le modèle - les macros auront toujours le potentiel d'écraser d'autres noms.

7voto

Bodo Thiesen Points 504

Supprimer a ;

ISO C++ spécifie que la suppression sur un pointeur NULL ne fait tout simplement rien.

Citation de l'ISO 14882:

    5.3.5 Supprimer \[expr.delete\]

    2   \[...\] Dans les deux cas, si la valeur de l'opérande de delete est le
        pointeur nul, l'opération n'a aucun effet. \[...\]

Cordialement, Bodo

/éditer : Je n'ai pas remarqué le a=NULL; dans le post original, donc nouvelle version : supprimer a ; a=NULL; cependant, le problème de définir a=NULL a déjà été signalé (fausse impression de sécurité).

7voto

Johannes Schaub - litb Points 256113

Clairement la fonction, pour une raison simple. La macro évalue son argument plusieurs fois. Cela peut avoir des effets secondaires néfastes. De plus, la fonction peut être mise en scope. Rien de mieux que ça :)

5voto

gimpf Points 3528

Généralement, préférez les fonctions en ligne aux macros, car les macros ne respectent pas la portée et peuvent entrer en conflit avec certains symboles pendant la prétraitement, entraînant des erreurs de compilation très étranges.

Bien sûr, parfois les modèles et les fonctions ne feront pas l'affaire, mais ce n'est pas le cas ici.

De plus, le better safe-delete n'est pas nécessaire, car vous pourriez utiliser des pointeurs intelligents, ne nécessitant donc pas de se souvenir d'utiliser cette méthode dans le code client, mais plutôt en l'encapsulant.

(edit) Comme d'autres l'ont souligné, safe-delete n'est pas sûr, car même si quelqu'un n'oublie pas de l'utiliser, cela peut ne pas avoir l'effet désiré. Donc, c'est en fait complètement inutile, car utiliser safe_delete correctement nécessite plus de réflexion que de simplement le définir à 0 soi-même.

2voto

Carl Seleborg Points 7748

Vous n'avez pas besoin de tester la nullité avec delete, c'est équivalent à une opération sans effet. (a) = NULL me fait lever un sourcil. La deuxième option est meilleure.

Cependant, si vous avez le choix, vous devriez utiliser des pointeurs intelligents, tels que std::auto_ptr ou tr1::shared_ptr, qui font déjà cela pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X