Essayez d'éviter d'utiliser malloc et realloc si possible et utilisez new et zap (delete). Mais parfois vous serez obligé d'utiliser les fonctions d'allocation de mémoire C en C++. Utilisez les fonctions my_malloc(), my_realloc() et my_free(). Ces fonctions font des allocations et des initialisations propres et essaient d'éviter les problèmes avec la mémoire. En plus ces fonctions (en mode DEBUG) peuvent garder une trace de la mémoire allouée et afficher l'usage total de la mémoire avant et après l'exécution du programme. Cela vous indique si vous avez des fuites de mémoire.
my_malloc
et my_realloc
sont définies ci-dessous.
Elles allouent un petit peu
plus de mémoire (SAFE_MEM = 5), initialisent l'espace mémoire et s'il n'est pas
possible d'allouer, stoppent le programme. Les fonctions call_check()
et
remove_ptr()
ne sont actives que si DEBUG est défini dans le Makefile et sont
égales à ((void)0)
(donc NULL) pour les versions de production sans débogage.
Elles permettent de suivre l'utilisation totale de la mémoire.
void *local_my_malloc(size_t size, char fname[], int lineno) { size_t tmpii = size + SAFE_MEM; void *aa = NULL; aa = (void *) malloc(tmpii); if (aa == NULL) raise_error_exit(MALLOC, VOID_TYPE, fname, lineno); memset(aa, 0, tmpii); call_check(aa, tmpii, fname, lineno); return aa; } char *local_my_realloc(char *aa, size_t size, char fname[], int lineno) { remove_ptr(aa, fname, lineno); unsigned long tmpjj = 0; if (aa) // aa != NULL tmpjj = strlen(aa); unsigned long tmpqq = size + SAFE_MEM; size_t tmpii = sizeof (char) * (tmpqq); aa = (char *) realloc(aa, tmpii); if (aa == NULL) raise_error_exit(REALLOC, CHAR_TYPE, fname, lineno); // pas memset!! memset(aa, 0, tmpii); aa[tmpqq-1] = 0; unsigned long kk = tmpjj; if (tmpjj> tmpqq) kk = tmpqq; for ( ; kk < tmpqq; kk++) aa[kk] = 0; call_check(aa, tmpii, fname, lineno); return aa; }
my_malloc
.Un exemple de l'utilisation de my_malloc
et de my_realloc
:
char *aa; int *bb; float *cc; aa = (char *) my_malloc(sizeof(char)* 214); bb = (int *) my_malloc(sizeof(int) * 10); cc = (float *) my_malloc(sizeof(int) * 20); aa = my_realloc(aa, sizeof(char) * 34); bb = my_realloc(bb, sizeof(int) * 14); cc = my_realloc(cc, sizeof(float) * 10);
my_realloc
vous n'avez pas besoin de transtyper car la
variable elle-même est passée et que le bon my_realloc
qui retourne le pointeur
sur le bon type est appelé. my_realloc
est surchargée pour char*, int* et float*.