#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);
Переменная
__malloc_initialize_hook
указывает на функцию, вызываемую как только инициализируется
реализация malloc. Это слабая переменная, так как она может
быть переопределена в приложении через следующее:
void (*__malloc_initialize_hook)(void) = 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;
}
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |