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 !