Utiliser des crochets Malloc

J’essaie d’utiliser un crochet malloc pour créer une fonction personnalisée my_malloc (). Dans mon programme principal, lorsque j’appelle malloc (), je souhaite l’appeler my_malloc (). Quelqu’un peut-il me donner s’il vous plaît un exemple sur la façon de procéder en C

Selon http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html , voici comment procéder avec les bibliothèques GCC.

/* Prototypes for __malloc_hook, __free_hook */ #include  /* Prototypes for our hooks. */ static void my_init_hook (void); static void *my_malloc_hook (size_t, const void *); static void my_free_hook (void*, const void *); /* Override initializing hook from the C library. */ void (*__malloc_initialize_hook) (void) = my_init_hook; static void my_init_hook (void) { old_malloc_hook = __malloc_hook; old_free_hook = __free_hook; __malloc_hook = my_malloc_hook; __free_hook = my_free_hook; } static void * my_malloc_hook (size_t size, const void *caller) { void *result; /* Restore all old hooks */ __malloc_hook = old_malloc_hook; __free_hook = old_free_hook; /* Call recursively */ result = malloc (size); /* Save underlying hooks */ old_malloc_hook = __malloc_hook; old_free_hook = __free_hook; /* printf might call malloc, so protect it too. */ printf ("malloc (%u) returns %p\n", (unsigned int) size, result); /* Restore our own hooks */ __malloc_hook = my_malloc_hook; __free_hook = my_free_hook; return result; } static void my_free_hook (void *ptr, const void *caller) { /* Restore all old hooks */ __malloc_hook = old_malloc_hook; __free_hook = old_free_hook; /* Call recursively */ free (ptr); /* Save underlying hooks */ old_malloc_hook = __malloc_hook; old_free_hook = __free_hook; /* printf might call free, so protect it too. */ printf ("freed pointer %p\n", ptr); /* Restore our own hooks */ __malloc_hook = my_malloc_hook; __free_hook = my_free_hook; } main () { ... } 

Si votre fonction appelle directement sbrk, vous pouvez simplement l’appeler malloc et vous assurer qu’elle est liée avant le malloc de la bibliothèque. Cela fonctionne sur tous les systèmes d’exploitation de type Unix. Pour Windows, voir Est-il possible de redéfinir malloc au moment du lien sous Windows?

Si votre fonction est un wrapper autour du malloc de la bibliothèque, la suggestion #define de Alex fonctionnera.

Notez simplement que la solution my_malloc_hook () ne fonctionne pas vraiment dans un programme multithread – voir http://www.phpman.info/index.php/man/malloc_hook/3 .

 #undef malloc #define malloc my_malloc 

Il suffit de mettre cela en haut de l’un des fichiers pour lesquels vous devez le faire.