2008-11-06 5 views
5

Estoy tratando de usar un gancho malloc para crear una función personalizada my_malloc(). En mi programa principal cuando llamo malloc() quiero que llame my_malloc() por favor alguien puede dar un ejemplo de cómo hacer esto en CUsando Malloc Hooks

Respuesta

-3
#undef malloc 
#define malloc my_malloc 

Sólo hay que poner que en la parte superior de cualquiera de los archivos tienes que hacerlo por.

+0

así que si creo un archivo de inclusión my_malloc.c y lo incluyo en mi programa principal y hago eso llamará a my_malloc en lugar de malloc? –

+1

Esto solo funcionará para llamadas directamente a malloc() en ese archivo. Cualquier llamada malloc en funciones en otros archivos (o en una biblioteca que no se ejerce control) no se verán afectadas. Si haces esto, sin embargo, probablemente también tengas un my_realloc. –

+0

#undefine no es una directiva de preprocesador C válida, es #undef – philant

1

Si su función llama a sbrk directamente, simplemente puede llamarlo malloc y asegurarse de que se vincule antes del malloc de la biblioteca. Esto funciona en todos los sistemas operativos tipo Unix. Para ventanas, vea Is there a way to redefine malloc at link time on Windows?

Si su función es un envoltorio alrededor del malloc de la biblioteca, la sugerencia #define de Alex funcionará.

5

De acuerdo con http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html, a continuación se explica cómo hacer esto con las bibliotecas de 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

¿Qué significa 'old_malloc_hook = __malloc_hook;'? Estoy confundido. Establecimos '__malloc_hook' a' old_malloc_hook' antes, ¿por qué guardamos '__malloc_hook' en' old_malloc_hook' nuevamente? Mi pregunta es aquí http://stackoverflow.com/questions/11356958/how-to-use-malloc-hook/11357013#comment14960880_11357013 –

+0

David Schwartz mencionó en su respuesta a http://stackoverflow.com/questions/11356958/how -to-use-malloc-hook que es importante guardar el __malloc_hook original para que se pueda restaurar justo antes de llamar al malloc() original. Esa es la línea justo debajo del comentario/* Restaure todos los ganchos viejos * /. Supongo que en este caso específico, no es necesario, ya que el gancho malloc original es nulo, pero para estar seguro debería hacerlo. Debe guardarse en las tres funciones "mi_". En my_malloc y my_free, debe hacerse justo antes de llamar a las funciones malloc y gratuitas del sistema. –