#include <malloc.h> void *(*__malloc_hook)(size_t size, const void *caller); void *(*__realloc_hook)(void *ptr, size_t size, const void *caller); void *(*__memalign_hook)(size_t alignment, size_t size, const void *caller); void (*__free_hook)(void *ptr, const void *caller); void (*__malloc_initialize_hook)(void); void (*__after_morecore_hook)(void);
La variable
__malloc_initialize_hook
pointe vers une fonction qui est appelée une seule fois
à l'initialisation de l'implémentation 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;
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 le segment de données.
#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 la routine originale */ static void *(*old_malloc_hook)(size_t, const void *); /* Écrasement de la routine d'initialisaton glibg */ 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; /* Replacer la routine originale */ __malloc_hook = old_malloc_hook; /* Appel de la routine originale */ result = malloc(size); /* Sauver la routine originale */ old_malloc_hook = __malloc_hook; /* printf() peut appeler malloc(), ... à protéger. */ printf("malloc(%u) called from %p returns %p\n", (unsigned int) size, caller, result); /* Replacer notre routine */ __malloc_hook = my_malloc_hook; return result; }
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 21 juillet 2003 et révisée le 17 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 3 malloc_hook ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Dernière mise à jour : 17 juillet 2008