Использование ловушек Malloc

Я пытаюсь использовать ловушку malloc для создания настраиваемой функции my_malloc (). В моей основной программе, когда я вызываю malloc (), я хочу, чтобы она вызывала my_malloc (), может ли кто-нибудь дать мне пример того, как это сделать на C

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
9 833
5

Ответы 5

#undef malloc
#define malloc my_malloc

Просто поместите это в начало любого файла, для которого вам нужно это сделать.

Итак, если я создам включаемый файл my_malloc.c и включу его в свою основную программу и просто сделаю это, он вызовет my_malloc вместо malloc?

Mat 06.11.2008 21:09

Это будет работать только для вызовов непосредственно malloc () в этом файле. Любые вызовы malloc в функциях в других файлах (или в библиотеке, которую вы не контролируете) не будут затронуты. Однако, если вы это сделаете, у вас, вероятно, также должен быть my_realloc.

Graeme Perrow 06.11.2008 21:13

#undefine не является допустимой директивой препроцессора C, это #undef

philant 06.11.2008 22:51

Не зря вы могли бы предпочесть #define malloc (s) my_malloc (s, ...), например #define malloc (s) my_malloc (s, ФАЙЛ, ЛИНИЯ) и т.п. Также использование макроса с аргументами позволяет вызывать (malloc) (s) в тех случаях, когда действительно нужен базовый символ.

Heath Hunnicutt 13.12.2009 10:10

Если ваша функция вызывает 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/‌…

Fei Xue 06.07.2012 13:50

Дэвид Шварц упомянул в своем ответе на stackoverflow.com/questions/11356958/how-to-use-malloc-hook, что сохранение исходных функций _malloc_hook важен, так как он может быть восстановлен непосредственно перед вызовом исходного malloc (). Это строка сразу под комментарием / * Восстановить все старые хуки * /. Я предполагаю, что в данном конкретном случае в этом нет необходимости, поскольку исходный хук malloc равен нулю, но на всякий случай это нужно сделать. Это должно быть сохранено во всех трех "моих" ". В my_malloc и my_free это должно быть сделано непосредственно перед вызовом системных функций malloc и free.

Randy Stegbauer 06.07.2012 18:27

Просто обратите внимание, что решение my_malloc_hook () на самом деле не работает в многопоточной программе - см. http://www.phpman.info/index.php/man/malloc_hook/3.

Эта ссылка не работает

bersanri 08.03.2017 13:26

Другие вопросы по теме