我已经在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;
}
任何建议/意见将不胜感激。如果您需要更多我的代码,请告诉我。
谢谢。
答案 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
之后的第一个内容。