Page suivantePage pr�c�denteTable 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 suivantePage pr�c�denteTable des mati�res

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:30