2008-11-06 16 views
5

Próbuję użyć haczyka malloc do utworzenia niestandardowej funkcji my_malloc(). W moim głównym programu podczas zgłoszę malloc() chcę go nazywać my_malloc() może ktoś proszę dać mi przykład o tym, jak to zrobić w CKorzystanie z haczyków Malloc

Odpowiedz

-3
#undef malloc 
#define malloc my_malloc 

Wystarczy umieścić że na wierzchu żadnych plików musisz to zrobić.

+0

więc jeśli utworzyć plik include my_malloc.c i dołączyć go do mojego programu głównego i po prostu zrobić to będzie wywoływać my_malloc zamiast malloc? –

+1

To będzie działać tylko dla wywołań bezpośrednio do malloc() w tym pliku. Nie ma to wpływu na wszelkie wywołania funkcji malloc w funkcjach w innych plikach (lub w bibliotece, której nie kontrolujesz). Jeśli jednak to zrobisz, prawdopodobnie powinieneś mieć także my_realloc. –

+0

#undefine nie jest prawidłową dyrektywą preprocesora C, jest #undef – philant

1

Jeśli twoja funkcja wywołuje sbrk bezpośrednio, możesz po prostu nazwać ją malloc i upewnić się, że zostanie dołączona przed malloc biblioteki. Działa to na wszystkich systemach typu Unix. W przypadku okien zobacz Is there a way to redefine malloc at link time on Windows?

Jeśli twoja funkcja jest opakowaniem wokół biblioteki malloc, sugestia #define autorstwa Alex zadziała.

5

Zgodnie z http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html, oto jak to zrobić z bibliotekami GCC.

/* Prototypes for __malloc_hook, __free_hook */ 
#include <malloc.h> 

/* 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() 
{ 
    ... 
} 
+0

co znaczy "old_malloc_hook = __malloc_hook;"? Jestem zdezorientowany. Przedtem ustawiamy '__malloc_hook' na' old_malloc_hook', dlaczego znowu zapisujemy '__malloc_hook' na' old_malloc_hook'? Moje pytanie jest tutaj http://stackoverflow.com/questions/11356958/how-to-use-malloc-hook/11357013#comment14960880_11357013 –

+0

David Schwartz wspomniał w swojej odpowiedzi na http://stackoverflow.com/questions/11356958/how -to-use-malloc-hook, że zapisanie oryginalnego __malloc_hook jest ważne, aby można go było przywrócić tuż przed wywołaniem oryginalnej funkcji malloc(). To jest linia tuż poniżej komentarza/* Przywróć wszystkie stare haki * /. Zgaduję, że w tym konkretnym przypadku jest to niepotrzebne, ponieważ oryginalny haczyk malloc ma wartość zerową, ale aby być bezpiecznym, należy to zrobić. Musi być zapisany we wszystkich trzech funkcjach "my_". W my_malloc i my_free trzeba to zrobić tuż przed wywołaniem funkcji malloc i wolnych funkcji systemu. –