2012-10-03 168 views
0

我试图将malloc'd字符串作为键和结构添加为值。每次都是一个新的字符串,但有时文本是相同的,所以他们应该被视为相同的密钥。添加结构后,我尝试检索它,但不成功(下面的“失败的添加”)。此外,我的总数没有得到更新,并且当销毁电话免费时,我就会发生故障。现在我已经评论了免费。GLib哈希表 - 无法查找键/值

GHashTable *heavyhitter= g_hash_table_new_full(NULL, g_str_equal, (GDestroyNotify) free_hh_key,(GDestroyNotify) free_hh_metadatarecords); 
... 
//Called multiple times: 
void add_to_heavyhitter_hashtable(struct memory *mem, const char *file,int line, size_t sz) { 
struct hh_metadata_record *hh_metadata_record_toadd; 

char *orig_key; 
asprintf(&orig_key, "%s:%d", file, line); 
char *effective_key = orig_key; 

gpointer e_key_ptr = &effective_key; 
gpointer hh_meta_ptr = &hh_metadata_record_toadd; 

if (g_hash_table_lookup_extended(mem->heavyhitter_hashtable, &orig_key, 
     &e_key_ptr, &hh_meta_ptr)) { 
    printf("found\n"); 
    hh_metadata_record_toadd = hh_meta_ptr; 
    printf("hh_metadata_record_toadd sz: %Zu\n", hh_metadata_record_toadd->sz); 
} else { 
    printf("not found\n"); 
    hh_metadata_record_toadd = hh_get_metadata_record_new(sz); 

} 

printf("Effective Key: %s\n", effective_key); 

hh_metadata_record_toadd->count += 1; 
hh_metadata_record_toadd->sz += sz; 
mem->hh_total_count += 1; 
mem->hh_total_size += sz; 

g_hash_table_insert(mem->heavyhitter_hashtable, e_key_ptr, 
     hh_metadata_record_toadd); 
if(g_hash_table_lookup_extended(mem->heavyhitter_hashtable, effective_key, NULL, NULL)) 
    printf("Succesfully added.\n"); 
else 
    printf("Failed add\n"); 
printf("hash Table size: %Zu\n",g_hash_table_size(mem->heavyhitter_hashtable)); 

免费功能注释掉现在:

void free_hh_key(gpointer a) { 
    (void) a; 
    printf("Freeing: %s\n", (char*) a); 
    //free(a); 
} 

结果:

not found 
Effective Key: hhtest.c:49 
Failed add 
hash Table size: 1 
not found 
Effective Key: hhtest.c:49 
Freeing: �' �' �' �/Y� 
Failed add 
hash Table size: 1 
not found 
Effective Key: hhtest.c:10 
Freeing: �' �' �' �/Y� 
Failed add 
hash Table size: 1 
+0

为什么你创建空的哈希表进行hash_func?你的代码非常难以阅读,考虑在问一个这样的问题时,在易于阅读的测试用例中隔离有问题的代码。 – Ancurio

回答