Comment utiliser __malloc_hook?

Dans le Manuel de référence de la bibliothèque GNU C , il existe un exemple de programme (p.65), mais je ne sais pas quelles sont les trois phrases: __malloc_hook = old_malloc_hook; old_malloc_hook = __malloc_hook; __malloc_hook = my_malloc_hook; signifier. Especailly le second, qui peut m’expliquer? Merci.

 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; } 

J’écris un petit programme pour le tester:

 #include  #include  /* Prototypes for our hooks. */ static void my_init_hook(void); static void *my_malloc_hook(size_t, const void *); /* Variables to save original hooks. */ static void *(*old_malloc_hook) (size_t, 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; __malloc_hook = my_malloc_hook; } static void *my_malloc_hook(size_t size, const void *caller) { void *result; /* Restore all old hooks */ __malloc_hook = old_malloc_hook; printf("1: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook); /* Call recursively */ result = malloc(size); printf("2: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook); /* Save underlying hooks */ old_malloc_hook = __malloc_hook; printf("3: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook); /* printf() might call malloc(), so protect it too. */ printf("malloc(%u) called from %p returns %p\n", (unsigned int)size, caller, result); /* Restore our own hooks */ __malloc_hook = my_malloc_hook; printf("4: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook); return result; } int main(void) { char *p; p = malloc(10); free(p); return 0; } 

le résultat du programme est:

 1: __malloc_hook = 0 old_malloc_hook = 0 2: __malloc_hook = 0 old_malloc_hook = 0 3: __malloc_hook = 0 old_malloc_hook = 0 malloc(10) called from 0xb7797f38 returns 0x932c008 4: __malloc_hook = 804849d old_malloc_hook = 0 

mais maintenant j’ai plus de problèmes, pourquoi old_malloc_hook sont tous 0, dans 1,2,3, pourquoi __malloc_hook sont 0? Je suis vraiment confus. Aidez moi.

Autant que je sache, tout fonctionne exactement comme prévu et le résultat est correct.

La variable, __malloc_hook , est 0 (ou null) probablement parce que le système par défaut est de ne pas avoir de hook malloc.

Comme David Schwartz l’a mentionné ci-dessus, __malloc_hook est important de sauvegarder le __malloc_hook origine afin qu’il puisse être restauré juste avant l’appel de malloc() . C’est la ligne juste en dessous du commentaire /* Restore all old hooks */ . J’imagine que dans ce cas précis, c’est inutile, puisque le crochet malloc d’origine est null , mais par sécurité, cela devrait être fait.

Soyez assuré que ce code s’exécute exactement comme vous le souhaitez. Pour le moment, je laisserais simplement ce ragoût pendant un moment et peut-être une ampoule s’éteindra-t-elle et un jour, vous comprendrez tout à fait. (Désolé, mais c’est le mieux que je puisse faire aujourd’hui.)

C’est assez bien documenté dans la page de manuel .

  1. old_malloc_hook = __malloc_hook; : Cela enregistre le hook malloc actuel dans une variable appelée old_malloc_hook . Vraisemblablement, nous économisons cela parce que nous sums sur le sharepoint le changer.

  2. __malloc_hook = my_malloc_hook; : Cela change le hook malloc actuel en my_malloc_hook .

  3. __malloc_hook = old_malloc_hook; : Les changements apportés par le crochet malloc à ce qu’il était avant de le changer, la valeur que nous avons sauvegardée dans old_malloc_hook .

Je pense que ce qui manque à ces réponses est le suivant:

old_malloc_hook NULL au début, puis malloc_hook = old_malloc_hook s’assure que le hook est désactivé et que nous ne faisons pas de recurse à l’infini lorsque nous appelons la fonction de bibliothèque réelle malloc dans la fonction my_malloc_hook