在C中释放一些hashmap桶

时间:2012-08-07 15:03:02

标签: c linked-list hashmap

我已经在C中实现了一个hashmap,经过相当多的工作后,我发现一切都很好......除了我的发布例程。

我的结构设置如下:

struct hashmap_element {
    int value;
    int key;
    int used;
    struct hashmap_element* next;
};
struct hashmap {
    int table_size;
    int current_size;
    struct hashmap_element* table;
};

我目前的非工作发布程序如下所示:

void hm_release(struct hashmap* hm) {
    hashmap_element* tmp;
    hashmap_element* curr_itr; 
    for(int x=0; x<hm->table_size; x++) {
        curr_itr = &hm->table[x];
        while (curr_itr) {
            tmp = curr_itr->next;
            free(curr_itr);
            curr_itr = tmp;
        } 
    }
    free(hm->table);
    free(hm);
}

不幸的是,这是第一次运行后的当前segvaults。我似乎无法让'curr_itr'锁定阵列中每个桶的第一个链。我在C中使用这样的动态内存相当新,并且已经坚持了几天了。

就我所知,一切都在正确初始化。这里的例子是我的hashmap init函数。

hashmap* hm_initialize() {
    hashmap* hm = malloc(sizeof(hashmap));
    hm->table = (hashmap_element*) calloc(INIT_SIZE, sizeof(hashmap_element));
    hm->table_size = INIT_SIZE;
    hm->current_size = 0;

    // init the buckets
    for (int x=0; x < hm->table_size; x++) {
        hm->table[x].used=0;
        hm->table[x].value=0;
        hm->table[x].key=0;
        hm->table[x].next=NULL;
    }
    return hm;
}

任何建议/意见将不胜感激。如果您需要更多我的代码,请告诉我。

谢谢。

1 个答案:

答案 0 :(得分:3)

你开始过早解放,

for(int x=0; x<hm->table_size; x++) {
    curr_itr = &hm->table[x];
    while (curr_itr) {
        tmp = curr_itr->next;
        free(curr_itr);
        curr_itr = tmp;
    } 
}

hashmap_element hm->table[x]未被malloc编辑,因此您不应free

for(int x=0; x<hm->table_size; x++) {
    curr_itr = hm->table[x].next;
    while (curr_itr) {
        tmp = curr_itr->next;
        free(curr_itr);
        curr_itr = tmp;
    } 
}

只释放(希望)malloc ed hashmap_element之后的第一个内容。