Page suivante - Page précédente - Table des matières

6. Utilisation de my_malloc et my_free

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;
}

Voir my_malloc.cpp et le fichier d'entête my_malloc.h pour une implantation complète de 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);

Remarquez que dans 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*.


Page suivante - Page précédente - Table des matières