如何使用__malloc_hook? [英] How to use __malloc_hook?

查看:400
本文介绍了如何使用__malloc_hook?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

GNU C库参考手册中,有一个例子程序(第65页),但我不知道什么是三句话:
__ malloc_hook = old_malloc_hook;
old_malloc_hook = __malloc_hook;
__ malloc_hook = my_malloc_hook;
意思。 Especailly第二个,谁可以给我解释一下吗?谢谢。

In GNU C Library Reference Manual, there is an example program(p.65), But I don't know what the three sentences: __malloc_hook = old_malloc_hook; old_malloc_hook = __malloc_hook; __malloc_hook = my_malloc_hook; mean. Especailly the second one, who can explain for me? thanks.

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;
}

我写了一个小程序来测试一下:

I write a little program to test it:

#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;
}

该方案的结果是:

the result of the program is :

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?我真的很困惑。帮帮我吧。

but now I have more problems, why old_malloc_hook are all 0, in 1,2,3, why __malloc_hook are 0? I am really confused. Help me.

推荐答案

据我可以告诉,一切工作完全按照预期和输出是好的。

As far as I can tell, everything is working exactly as expected and the output is fine.

变量, __ malloc_hook 0(或空),可能是因为系统默认是的的有一个malloc挂钩。

The variable, __malloc_hook, is 0 (or null) probably because the system's default is to not have a malloc hook.

当大卫·施瓦茨如上所述,保存原始 __ malloc_hook 很重要,这样就可以只原始的malloc之前恢复()被调用。这只是下面的评论 / *行恢复所有旧的钩子* / 。我猜,在这种特殊情况下,这是不必要的,因为原来的malloc挂钩,但为了安全起见,应该做的。

As David Schwartz mentioned above, saving the original __malloc_hook is important so that it can be restored just before the original malloc() is called. That's the line just below the comment /* Restore all old hooks */. I'm guessing that in this specific case, it's unnecessary, since the original malloc hook is null, but to be safe it should be done.

请放心,这code上,就像你想要它。现在,我只想让这个炖了一会儿,也许是一个电灯泡熄灭,有一天,你会完全理解它。 (抱歉,这是我今天能够做的最好的。)

Please rest assured that this code is running just like you want it to. For now, I would simply let this stew for a while and perhaps a light-bulb will go off and one day, you'll understand it completely. (Sorry, but that's the best I can do today.)

这篇关于如何使用__malloc_hook?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆