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(3), realoc(3) и free(3). Для этого следует создать и использовать собственные функции зацепов. Например Вы можете использовать эти зацепы, чтобы помочь себе с отладкой программы, которая использует динамическое выделение памяти.

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

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

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

СООТВЕТСТВИЕ СТАНДАРТАМ
Эти функции являются расширениями GNU.

ЗАМЕЧАНИЯ
Использование этих зацепочных функций не безопасно для многопоточных программах, и теперь они считаются устаревшими. Начиная с glibc версии 2.24 и впредь, __ malloc_initialize_hook переменная была удалена из API. Теперь программисты должны вместо этого подменять вызовы к соответствующим функциям, в местах их экспорта, где определены такие функции как "malloc" и "free".

ПРИМЕР
Вот короткий пример того, как использовать эти переменные.

#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\n",
            (unsigned int) size, caller, result);
    /* Восстанавливаем наши собственные зацепы*/
    __malloc_hook = my_malloc_hook;
    return result;
}

СМОТРИТЕ ТАКЖЕ
mallinfo(3), malloc(3), mcheck(3), mtrace(3)