6

カスタム関数 my_malloc() を作成するために malloc フックを使用しようとしています。メインプログラムで malloc() を呼び出すときに my_malloc() を呼び出したいのですが、誰かが C でこれを行う方法の例を教えてください。

4

5 に答える 5

6

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 ()
 {
   ...
 }
于 2008-11-06T18:11:04.090 に答える
6

ここを見ましたか? http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html

于 2008-11-06T18:06:07.003 に答える
1

関数がsbrkを直接呼び出す場合は、単にmallocと呼び、ライブラリのmallocの前にリンクされていることを確認できます。これは、すべてのUnixタイプのOSで機能します。Windowsについては、「Windowsでリンク時にmallocを再定義する方法はありますか?」を参照してください。

関数がライブラリのmallocのラッパーである場合、Alexによる#define提案が機能します。

于 2008-11-06T18:08:50.943 に答える
1

my_malloc_hook()ソリューションはマルチスレッドプログラムでは実際には機能しないことに注意してください。http: //www.phpman.info/index.php/man/malloc_hook/3を参照してください。

于 2009-12-13T06:34:28.940 に答える
-3
#undef malloc
#define malloc my_malloc

必要なファイルの先頭にそれを配置するだけです。

于 2008-11-06T18:05:34.820 に答える