MALLOC_HOOK(3)

НАЗВАНИЕ
__malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook, __realloc_hook, __after_morecore_hook - переменные отладки malloc

СИНТАКСИС

#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);

ОПИСАНИЕ
Библиотека GNU C позволяет изменять поведение malloc(), realloc(), и free() через указание соответствующих функций для крюка ("hook"). Также можно использовать эти крюки для помощи во время отладки программ, использующих, например, динамическое распределение памяти.

Переменная __malloc_initialize_hook указывает на функцию, вызываемую как только инициализируется реализация malloc. Это слабая переменная, так как она может быть переопределена в приложении через следующее:
    void (*__malloc_initialize_hook)(void) = my_init_hook;
Теперь функция my_init_hook() может инициализировать все крюки.

Четыре функции, на которые указывают __malloc_hook, __realloc_hook, __memalign_hook, __free_hook имеют прототипы, как функции malloc(), realloc(), memalign(), free(), соответственно, за исключением того, что у них есть последний аргумент caller, выдающий адрес вызывающего malloc().

Переменная __after_morecore_hook указывает на функцию, вызываемую каждый раз после запроса sbrk().

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
Приведем краткий пример использования этих переменных.

#include <stdio.h>
#include <malloc.h>

/*  Прототипы наших крюков.   */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);
/* Переменные, сохраняющие изначальные крюки. */
static void *(*old_malloc_hook)(size_t, const void *);

/* Переопределение инициализирующих крюков из библиотеки C. */
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;
    /* Восстанавливаем все старые крюки */
    __malloc_hook = old_malloc_hook;
    /* Рекурсивный вызов */
    result = malloc (size);
    /* Сохраняет подчиненные крюки */
    old_malloc_hook = __malloc_hook;
    /* `printf' должен вызывать `malloc', поэтому защищать и его. */
    printf ("malloc(%u) called from %p returns %p,
        (unsigned int) size, caller, result);
    /* Восстанавливать наши старые крюки */
    __malloc_hook = my_malloc_hook;
    return result;
}

СМ. ТАКЖЕ
mallinfo(3), malloc(3), mtrace(3), mcheck(3)