2012-09-30 37 views
0

我能说会道哈希表我创建:GLib的哈希表:免费无效()

​​

在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) 

我有没有内存泄漏。但是,如果我在这两个函数行注释掉,然后我得到的内存泄漏(错误摘要:从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接收到的指针来获取内存密钥。

+0

你从哪里得到散列表密钥? – nneonneo

+0

@nneonneo,我改写了我的问题,因为valgrind有一个较旧的代码副本,但总体错误仍然相同。我从malloc返回的指针获取散列表键。 – user994165

回答

0

事实证明,我打电话“免费”两次。我忘记了我自由发布的“免费”包装,我只剩下要做的就是释放元数据,而不是实际的指针。