#include <malloc.h> void *(*volatile __malloc_hook)(size_t size, const void *caller); void *(*volatile __realloc_hook)(void *ptr, size_t size, const void *caller); void *(*volatile __memalign_hook)(size_t alignment, size_t size, const void *caller); void (*volatile __free_hook)(void *ptr, const void *caller); void (*__malloc_initialize_hook)(void); void (*volatile __after_morecore_hook)(void);
La variable __malloc_initialize_hook pointe vers une fonction qui est appelée une seule fois à l'initialisation de malloc(). C'est une variable libre qui peut être modifiée par l'application avec une déclaration comme celle-ci :
void (*__malloc_initialize_hook)(void) = my_init_hook;
À présent, la fonction my_init_hook() pourra faire toute l'initialisation des routines.
Les quatre fonctions pointées par __malloc_hook, __realloc_hook, __memalign_hook et __free_hook ont des prototypes semblables à ceux des fonctions malloc(3), realloc(3), memalign(3) et free(3), respectivement, avec un argument final supplémentaire caller qui fournit l'adresse du code appelant malloc(3), etc.
La variable __after_morecore_hook pointe sur une fonction qui est invoquée à chaque fois que sbrk(2) a été appelée pour augmenter la mémoire.
#include <stdio.h> #include <malloc.h>
/* Prototypes de nos routines */ static void my_init_hook(void); static void *my_malloc_hook(size_t, const void *);
/* Variables pour sauver les routines originelles */ static void *(*old_malloc_hook)(size_t, const void *);
/* Surcharge de la routine d'initialisation de la bibliothèque C */ void (*__malloc_initialize_hook)(void) = my_init_hook;
static void
my_init_hook(void)
{
old_malloc_hook = __malloc_hook;
__malloc_hook = my_malloc_hook;
}
static void *
my_malloc_hook(size_t size, const void *caller)
{
void *result;
/* Restaurer la routine originale */
__malloc_hook = old_malloc_hook;
/* Appeler récursivement */
result = malloc(size);
/* Sauver la routine originale */
old_malloc_hook = __malloc_hook;
/* printf() peut appeler malloc(), il faut donc la protéger également */
printf("malloc(%zu) appelée depuis %p renvoie %p\n",
size, caller, result);
/* Restaurer nos propres routines */
__malloc_hook = my_malloc_hook;
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à