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*.Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:30