Page suivantePage précédenteTable des matières

4. La commande C++ zap (delete)

Les commandes delete et new sont à préférer en C++ aux fonctions malloc et free du C. Prévoyez d'utiliser new et zap (commande delete) à la place de malloc et free autant que possible.

Pour rendre la commande delete encore plus propre, faisons une commande zap(). Définissons zap() ainsi :


/*
** Utilise do while pour le rendre robuste et sans erreur en cas d'utilisation
** avec les macros.
** Par exemple, si "do-while" n'est PAS utilisé alors les résultats seront
** différents comme dans
** if (bbint == 4)
**              aa = 0
** else
**              zap(aptr);  // Probleme ! aptr sera toujours mis a NULL
*/
#define zap(x) do { delete(x); x = NULL; } while (0)

La commande zap() libèrera la mémoire pointée et initialisera le pointeur à NULL. Cela assurera qu'en cas d'appels multiples à zap() pour un même pointeur, le programme ne plantera pas. Par exemple :


 zap(pFirstname);
 zap(pFirstname); // pas de plantages, car pFirstname est NULL maintenant
 zap(pFirstname); // pas de plantages, car pFirstname est NULL maintenant
 zap(pLastname);
 zap(pJobDescription);

Il n'y a rien de magique là-dedans, cela évite juste la répétition de code, économise le temps de frappe et rend les programmes plus lisibles. Les programmeurs C++ oublient souvent de réinitialiser à NULL les pointeurs libérés et cela cause des problèmes ennuyeux comme des 'core dumps' et des plantages. zap() gère cela automatiquement. Ne pas faire de transtypage dans la commande zap() : si quelque chose pose problème dans la commande zap() précédente, il y a probablement une autre erreur ailleurs.

De même my_malloc(), my_realloc() et my_free() devraient être utilisés à la place de malloc(), realloc() et free(), car elles sont plus propres et font des vérifications supplémentaires. Par exemple, parcourez le fichier "String.h" qui utilise les fonctions my_malloc() et my_free().

ATTENTION : Ne pas utiliser free() pour libérer la mémoire allouée avec new, ni utiliser delete pour libérer la mémoire allouée avec malloc(). Si vous faites ça, les résultats seront imprévisibles !


Page suivantePage précédenteTable des matières