#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
#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
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.
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é).
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.
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 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.