Il est donc conseillé de définir une macro :
#define FREE( _p_ ) do { \
if ( (_p_) == NULL ) { \
fprintf( stderr, "Desallocation impossible dans le fichier %s, ligne %d\n", \
__FILE__, __LINE__ ); \
exit( EXIT_FAILURE ); \
} \
free(_p_); \
(_p_) = NULL; \
} while (0)
et de tout simplement remplacer free(ptr); par FREE(ptr);
|
On doit aussi prendre la bonne habitude de sortir du programme avec un message d’erreur quand une allocation a échoué, par exemple :
int* ptrEntier = (int*)malloc( sizeof(int) );
if ( ptrEntier == NULL) {
printf( "L’allocation a échoué !\n" );
return 1;
}
Ou encore plus « pro » (merci au site developpez.com) :
#define MALLOC( _t_, _p_ ) do { \
(_p_) = (_t_ *)malloc( sizeof(_t_) ); \
if ( (_p_) == NULL ) { \
fprintf( stderr, "Allocation impossible dans le fichier %s, ligne %d\n", \
__FILE__, __LINE__ ); \
exit( EXIT_FAILURE ); \
} \
} while (0)
Il suffira alors de remplacer (avantageusement) :
int* ptrEntier = (int*)malloc( sizeof(int) ); par : int* ptrEntier; MALLOC( int, ptrEntier ); |
Comme ci-dessus, on peut aussi définir une macro :
#define NMALLOC( _n_, _t_, _p_ ) do { \
(_p_) = (_t_ *)malloc( (_n_) * sizeof(_t_) ); \
if ( (_p_) == NULL ) { \
fprintf( stderr, "Allocation impossible dans le fichier %s, ligne %d\n", \
__FILE__, __LINE__ ); \
exit( EXIT_FAILURE ); \
} \
} while (0)
Il suffira alors de remplacer (avantageusement) :
TabDyn vTab = (TabDyn)malloc( 100 * sizeof(int) ); par : TabDyn vTab; NMALLOC( 100, int, vTab );
Dans ce cas, on pourait définir plus simplement la macro MALLOC :
|