0

私は私が作成したGLibハッシュテーブルを持っています:

GHashTable *gmem = g_hash_table_new_full(NULL, NULL, (GDestroyNotify) free_memoryaddresses, (GDestroyNotify)free_metadatarecords);

Valgrindでは、次のエラーが発生します。

==19610== 1 errors in context 2 of 2:
==19610== Invalid free() / delete / delete[] / realloc()
==19610==    at 0x40291BE: free (vg_replace_malloc.c:427)
==19610==    by 0x804939F: free_memoryaddresses (memory.c:361)
==19610==    by 0x4077A0F: g_hash_table_remove_all_nodes (ghash.c:533)
==19610==    by 0x4078A7F: g_hash_table_remove_all (ghash.c:1345)
==19610==    by 0x8048BCA: m61_printstatistics (m61.c:115)
==19610==    by 0x80494E9: main (mytest.c:9)
==19610==  Address 0x4341b50 is 0 bytes inside a block of size 1 free'd
==19610==    at 0x40291BE: free (vg_replace_malloc.c:427)
==19610==    by 0x8048994: m61_free (m61.c:51)
==19610==    by 0x80494E4: main (mytest.c:8)

メモリリークはありません。しかし、これら2つの関数の行をコメントアウトすると、メモリリークが発生し、(エラーの概要:1つのコンテキストから1つのエラー(抑制:0から0))

void free_memoryaddresses(gpointer a)
{   (void)a;
    free(a);
}

void free_metadatarecords(gpointer a)
{   (void)a;
    free_metadata_record(a);
    free(a);
}

これは私のValgrindコマンドです:

G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind --leak-check=yes --tool=memcheck --track-origins=yes -v ./mytest

mallocから受け取ったポインタを格納することでメモリキーを取得しています。

4

1 に答える 1

0

「無料」を 2 回呼び出していたことが判明しました。「フリー」ラッパーが free と呼ばれることを忘れていたので、あとは実際のポインターではなく、メタデータを解放するだけでした。

于 2012-09-30T05:51:33.753 に答える