0

メモリ構造体の下にあるGLibハッシュテーブルにいくつかのキーと値のペアを追加しました。キーは、mallocから返される(char *)ポインターです。値は、mallocが割り当てたサイズです。

void addstomemstruct(struct memory *mem, char *key_address, size_t sz) {
    g_hash_table_insert(mem->singleton, key_address, &sz);
    printf("** retrieving size: %Zu add=%p\n",(*(size_t*) g_hash_table_lookup(mem->singleton, key_address)), key_address);
}

後で、キーに基づく値に基づいて値を取得しようとしたとき、返されるサイズ(値)は常に10であり、これはハッシュテーブルに追加した最後の値でした。

size_t get_blocksize(GHashTable *hashtable, char *key_address, size_t *result_flag)
{   size_t *sz_ptr = (size_t *) g_hash_table_lookup(hashtable, key_address);
    ...

char *logmsg;asprintf(&logmsg,"In get_blocksize: *sz_ptr=%Zu\n",*sz_ptr);
    log_msg(logmsg);

printf("** retrieving size: %Zu add=%p\n",(*(size_t*) g_hash_table_lookup(hashtable, key_address)), key_address);
...
}

プリントアウト:

preparing to add pointer: 0x9b52f10
** adding size: 1
** retrieving size: 1 add=0x9b52f10
preparing to add pointer: 0x9b52f48
** adding size: 2
** retrieving size: 2 add=0x9b52f48
preparing to add pointer: 0x9b52f58
** adding size: 3
...
preparing to add pointer: 0x9b52fc8
** adding size: 10
** retrieving size: 10 add=0x9b52fc8

その後、最初の値を取得しようとすると、次のようになります。

In get_blocksize: *sz_ptr=10
** retrieving size: 10 add=0x9b52f10
Freed address 0x9b52f10.  Size: 10. mem->stats->active_count=9, mem->stats->active_size=45.
4

1 に答える 1

3

自動保存期間変数(関数パラメーター)へのポインターをハッシュテーブル値として渡します。スコープ外に出た場合、アクセスするのは未定義の動作です。

次のいずれかを実行できます。

  • /にストレージszを割り当て、ハッシュテーブルの作成時に適切なものを登録します。mallocgnewvalue_destroy_func
  • 値がポインターに収まるという事実を利用して、size_tそれをにキャストしgpointerます。技術的にはこれはUBですが、ほとんどのプラットフォームで動作するはずです。小さなオブジェクトの割り当てがボトルネックとして識別されない限り、おそらくこれを行うべきではありません。
于 2012-09-26T05:52:06.530 に答える