在 GNU C Library Reference Manual 中,有一个示例程序(p.65),但我不知道这三个句子是什么:
__malloc_hook = old_malloc_hook;
old_malloc_hook = __malloc_hook;
__malloc_hook = my_malloc_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;
}
我写了一个小程序来测试它:
#include <stdio.h>
#include <malloc.h>
/* Prototypes for our hooks. */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);
/* Variables to save original hooks. */
static void *(*old_malloc_hook) (size_t, 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;
__malloc_hook = my_malloc_hook;
}
static void *my_malloc_hook(size_t size, const void *caller)
{
void *result;
/* Restore all old hooks */
__malloc_hook = old_malloc_hook;
printf("1: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
/* Call recursively */
result = malloc(size);
printf("2: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
/* Save underlying hooks */
old_malloc_hook = __malloc_hook;
printf("3: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
/* printf() might call malloc(), so protect it too. */
printf("malloc(%u) called from %p returns %p\n",
(unsigned int)size, caller, result);
/* Restore our own hooks */
__malloc_hook = my_malloc_hook;
printf("4: __malloc_hook = %x old_malloc_hook = %x\n", __malloc_hook, old_malloc_hook);
return result;
}
int main(void)
{
char *p;
p = malloc(10);
free(p);
return 0;
}
该计划的结果是:
1: __malloc_hook = 0 old_malloc_hook = 0
2: __malloc_hook = 0 old_malloc_hook = 0
3: __malloc_hook = 0 old_malloc_hook = 0
malloc(10) called from 0xb7797f38 returns 0x932c008
4: __malloc_hook = 804849d old_malloc_hook = 0
但现在我有更多问题,为什么old_malloc_hook
都是0,在1,2,3中为什么__malloc_hook
为0?我真的很困惑。帮助我。
答案 0 :(得分:5)
据我所知,一切都按预期完成,输出也很好。
变量__malloc_hook
为0(或为null)可能是因为系统的默认值是而不是具有malloc挂钩。
正如David Schwartz上面提到的那样,保存原始__malloc_hook
非常重要,这样才能在原始malloc()
被调用之前恢复它。这就是评论/* Restore all old hooks */
下面的一行。我猜测在这种特殊情况下,它是不必要的,因为原始的malloc钩子是null
,但为了安全起见,应该这样做。
请放心,此代码正如您所希望的那样运行。现在,我只想让它炖一段时间,也许一个灯泡会熄灭,有一天,你会完全理解它。 (对不起,但这是我今天能做的最好的事情。)
答案 1 :(得分:3)
在manual page中记录得非常好。
old_malloc_hook = __malloc_hook;
:这会将当前malloc挂钩保存在名为old_malloc_hook
的变量中。据推测,我们正在拯救它,因为我们即将改变它。
__malloc_hook = my_malloc_hook;
:这会将当前的malloc挂钩更改为my_malloc_hook
。
__malloc_hook = old_malloc_hook;
:将malloc挂钩更改回我们更改之前的状态,我们保存在old_malloc_hook
中的值。
答案 2 :(得分:0)
我认为缺少这些答案如下:
old_malloc_hook
在开始时为NULL
,然后malloc_hook = old_malloc_hook
确保挂钩已被禁用,并且在调用实际库函数时我们无法无限递归malloc
在函数my_malloc_hook
内部。