




#undef malloc
#define malloc my_malloc
Просто поместите это в начало любого файла, для которого вам нужно это сделать.
Это будет работать только для вызовов непосредственно malloc () в этом файле. Любые вызовы malloc в функциях в других файлах (или в библиотеке, которую вы не контролируете) не будут затронуты. Однако, если вы это сделаете, у вас, вероятно, также должен быть my_realloc.
#undefine не является допустимой директивой препроцессора C, это #undef
Не зря вы могли бы предпочесть #define malloc (s) my_malloc (s, ...), например #define malloc (s) my_malloc (s, ФАЙЛ, ЛИНИЯ) и т.п. Также использование макроса с аргументами позволяет вызывать (malloc) (s) в тех случаях, когда действительно нужен базовый символ.
Вы сюда смотрели? http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html
Если ваша функция вызывает sbrk напрямую, вы можете просто вызвать ее malloc и убедиться, что она связана до того, как библиотека malloc. Это работает во всех операционных системах типа Unix. Для окон см. Есть ли способ переопределить malloc во время компоновки в Windows?
Если ваша функция является оболочкой для библиотеки malloc, предложение #define от Alex будет работать.
Согласно http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html, вот как это сделать с библиотеками 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 ()
{
...
}
что означает `old_malloc_hook = __malloc_hook;`? Я запутался. Мы раньше устанавливали __malloc_hook на old_malloc_hook, почему мы снова сохраняем __malloc_hook в old_malloc_hook? Мой вопрос здесь stackoverflow.com/questions/11356958/how-to-use-malloc-hook/…
Дэвид Шварц упомянул в своем ответе на stackoverflow.com/questions/11356958/how-to-use-malloc-hook, что сохранение исходных функций _malloc_hook важен, так как он может быть восстановлен непосредственно перед вызовом исходного malloc (). Это строка сразу под комментарием / * Восстановить все старые хуки * /. Я предполагаю, что в данном конкретном случае в этом нет необходимости, поскольку исходный хук malloc равен нулю, но на всякий случай это нужно сделать. Это должно быть сохранено во всех трех "моих" ". В my_malloc и my_free это должно быть сделано непосредственно перед вызовом системных функций malloc и free.
Просто обратите внимание, что решение my_malloc_hook () на самом деле не работает в многопоточной программе - см. http://www.phpman.info/index.php/man/malloc_hook/3.
Эта ссылка не работает
Итак, если я создам включаемый файл my_malloc.c и включу его в свою основную программу и просто сделаю это, он вызовет my_malloc вместо malloc?