2

GNU Cライブラリリファレンスマニュアルには、サンプルプログラム(p.65)がありますが、3つの文の__malloc_hook = old_malloc_hook; old_malloc_hook = __malloc_hook; __malloc_hook = my_malloc_hook; 意味がわかりません 。特に2番目のもの、誰が私のために説明することができますか?ありがとう。

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すべて__malloc_hookが0であるのか、1、2、3ではなぜ0なのですか?私は本当に混乱しています。助けて。

4

3 に答える 3

5

私の知る限り、すべてが期待どおりに機能しており、出力は正常です。

変数、、__malloc_hookは0(またはnull)です。これは、おそらくシステムのデフォルトがmallocフックを持たないためです。

David Schwartzが前述したように、元のファイルを保存して、元のファイルが呼び出される__malloc_hook直前に復元できるようにすることが重要です。malloc()コメントのすぐ下の行/* Restore all old hooks */です。この特定のケースでは、元のmallocフックがnullであるため、これは不要だと思いますが、安全のために行う必要があります。

このコードは希望どおりに実行されますので、ご安心ください。今のところ、このシチューをしばらく放置すると、電球が消えて、いつか完全に理解できるでしょう。(申し訳ありませんが、それが今日私ができる最善のことです。)

于 2012-07-06T14:20:14.050 に答える
4

マニュアルページにかなりよく記載されています。

  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

于 2012-07-06T06:34:52.873 に答える
0

これらの答えが欠けているのは次のとおりだと思います。

old_malloc_hookNULL最初にあり、フックが無効になっていることを確認し、関数内のmalloc_hook = old_malloc_hook実際のライブラリ関数を呼び出しているときに無限に繰り返されないようにします。mallocmy_malloc_hook

于 2016-12-14T01:20:32.343 に答える