2010-03-13 5 views
2

g_strdup를 무료로 만들려고하고 있지만 잘못된 것을 잘 모릅니다.mem-leak freeing g_strdup

나는 점점 valgrind --tool=memcheck --leak-check=yes ./a.out를 계속 사용 : 내가 해제에 다른 방법을 시도하지만 성공 지금까지 한

==4506== 40 bytes in 10 blocks are definitely lost in loss record 2 of 9 
==4506== at 0x4024C1C: malloc (vg_replace_malloc.c:195) 
==4506== by 0x40782E3: g_malloc (in /lib/libglib-2.0.so.0.2200.3) 
==4506== by 0x4090CA8: g_strdup (in /lib/libglib-2.0.so.0.2200.3) 
==4506== by 0x8048722: add_inv (dup.c:26) 
==4506== by 0x80487E6: main (dup.c:47) 

==4506== 504 bytes in 1 blocks are possibly lost in loss record 4 of 9 
==4506== at 0x4023E2E: memalign (vg_replace_malloc.c:532) 
==4506== by 0x4023E8B: posix_memalign (vg_replace_malloc.c:660) 
==4506== by 0x408D61D: ??? (in /lib/libglib-2.0.so.0.2200.3) 
==4506== by 0x408E5AC: g_slice_alloc (in /lib/libglib-2.0.so.0.2200.3) 
==4506== by 0x4061628: g_hash_table_new_full (in /lib/libglib-2.0.so.0.2200.3) 
==4506== by 0x40616C7: g_hash_table_new (in /lib/libglib-2.0.so.0.2200.3) 
==4506== by 0x8048795: main (dup.c:42) 

. 나는 어떤 도움을 주셔서 감사하겠습니다. 감사합니다

본문 : 그것은 컴파일하고 잘 실행됩니다.


#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <glib.h> 
#include <stdint.h> 

struct s { 
    char *data; 
}; 

static GHashTable *hashtable1; 
static GHashTable *hashtable2; 

static void add_inv(GHashTable *table, const char *key) 
{ 
    gpointer old_value, old_key; 
    gint value; 

    if(g_hash_table_lookup_extended(table,key, &old_key, &old_value)){ 
     value = GPOINTER_TO_INT(old_value); 
     value = value + 2; 
     /*g_free (old_key);*/ 
    } else { 
     value = 5; 
    } 
    g_hash_table_replace(table, g_strdup(key), GINT_TO_POINTER(value)); 
} 

static void print_hash_kv (gpointer key, gpointer value, gpointer user_data){ 
    gchar *k = (gchar *) key; 
    gchar *h = (gchar *) value; 
    printf("%s: %d \n",k, h); 
} 

int main(int argc, char *argv[]){ 

    struct s t; 

    t.data = "bar"; 

    int i,j; 
    hashtable1 = g_hash_table_new(g_str_hash, g_str_equal); 
    hashtable2 = g_hash_table_new(g_str_hash, g_str_equal); 

    for(i=0;i<10;i++){ 
     add_inv(hashtable1, t.data); 
     add_inv(hashtable2, t.data); 
    } 

    /*free(t.data);*/ 
    /*free(t.data);*/ 

    g_hash_table_foreach (hashtable1, print_hash_kv, NULL); 
    g_hash_table_foreach (hashtable2, print_hash_kv, NULL); 

    g_hash_table_destroy(hashtable1); 
    g_hash_table_destroy(hashtable2); 

    return 0; 
} 
+0

감사합니다. 당신이 언급 한 것처럼 일하고있는 것 같습니다 : hashtable1 = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify) free_key_value, NULL); – Mike

답변

1

g_strdup (키)의 메모리를 할당하지만, 아무도 메모리 것을 해제하지 않는다.

아마도 g_hash_table_new 대신 g_hash_table_new_full에 key_destroy_func를 제공해야합니다.

-1

왜 당신에게 g_strdup() 해시 테이블에 넣은 모든 키? 그렇게해야합니까? GTK가 해시 테이블에있는 char* 키를 모두 dup 할 필요가 있다면 g_hash_table_destroy() 일 때 시엄을 자유롭게 할 수있을 것입니다.

GTK 문서를 확인하십시오.

관련 문제