我正在尝试使用 malloc 挂钩来创建自定义函数 my_malloc()。在我的主程序中,当我调用 malloc() 我希望它调用 my_malloc() 有人可以给我一个关于如何在 C 中执行此操作的示例
Dan Snyder
问问题
10037 次
5 回答
6
于 2008-11-06T18:06:07.003 回答
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 回答
1
请注意,my_malloc_hook() 解决方案在多线程程序中并不真正适用 - 请参阅http://www.phpman.info/index.php/man/malloc_hook/3。
于 2009-12-13T06:34:28.940 回答
1
如果您的函数直接调用 sbrk,您可以简单地调用它 malloc 并确保它在库的 malloc 之前被链接。这适用于所有 Unix 类型的操作系统。对于 Windows,请参阅是否有办法在 Windows 上的链接时重新定义 malloc?
如果您的函数是库 malloc 的包装器,则 Alex 的 #define 建议将起作用。
于 2008-11-06T18:08:50.943 回答
-3
#undef malloc
#define malloc my_malloc
只需将其放在您需要执行此操作的任何文件的顶部即可。
于 2008-11-06T18:05:34.820 回答