首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用__malloc_hook?

如何使用__malloc_hook?
EN

Stack Overflow用户
提问于 2012-07-06 06:29:01
回答 3查看 7.2K关注 0票数 2

在GNU图书馆参考手册中,有一个示例程序(第65页),但我不知道这三句话是什么意思:__malloc_hook = old_malloc_hook; old_malloc_hook = __malloc_hook; __malloc_hook = my_malloc_hook;。尤其是第二个,谁能为我解释呢?谢谢。

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
#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;
}

该方案的结果是:

代码语言:javascript
复制
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?我真的很困惑。帮帮我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-06 14:20:14

据我所知,一切都如期而至,输出也很好。

变量__malloc_hook为0(或null),可能是因为系统的默认设置是没有malloc挂钩。

正如上面David所提到的,保存原始__malloc_hook非常重要,这样就可以在调用原始malloc()之前恢复它。这是评论/* Restore all old hooks */下面的一行。我猜想,在这种特殊情况下,这是不必要的,因为最初的malloc钩子是null,但是为了安全起见,应该这样做。

请放心,此代码正在运行,正如您希望的那样。现在,我只想让这个炖一会儿,也许一个灯泡会熄灭,总有一天,你会完全理解它。(对不起,这是我今天所能做的最好的了。)

票数 5
EN

Stack Overflow用户

发布于 2012-07-06 06:34:52

它在手册页中有很好的文档。

  1. old_malloc_hook = __malloc_hook;:这会将当前的malloc挂钩保存在一个名为old_malloc_hook的变量中。想必,我们是在拯救它,因为我们即将改变它。
  2. __malloc_hook = my_malloc_hook;:这将当前malloc挂钩更改为my_malloc_hook
  3. __malloc_hook = old_malloc_hook;:将malloc钩子更改回我们更改它之前的任何内容,即我们在old_malloc_hook中保存的值。
票数 4
EN

Stack Overflow用户

发布于 2016-12-14 01:20:32

我认为这些答案缺少的是以下几点:

old_malloc_hook在开始时是NULL,然后malloc_hook = old_malloc_hook确保钩子是禁用的,我们在函数my_malloc_hook中调用实际的库函数malloc时不会无限递归。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11356958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档