我有一个哈希表,它是一个桶指针数组(在这个项目中节点只是称为桶)。哈希表使用链表链接来避免冲突。这是我的数据结构:
typedef struct bucket {
char *key;
void *value;
struct bucket *next;
} Bucket;
typedef struct {
int key_count;
int table_size;
void (*free_value)(void *);
Bucket **buckets;
} Table;
Valgrind 在以下行给我一个无效的 free() 错误消息:table->free_value(curr->value);
在方法中:
/* Removes a bucket consisting of a key and value pair */
int remove_entry(Table * table, const char *key) {
unsigned int hc = 0;
int found = 0;
Bucket *curr;
Bucket *prev;
if (table == NULL || key == NULL) {
return FAIL;
}
hc = hash_code(key)%(table->table_size);
if (table->buckets[hc] != NULL) {
curr = table->buckets[hc];
prev = NULL;
while (curr != NULL) {
if (strcmp(curr->key, key) == 0) {
found = 1;
if (table->free_value != NULL && curr->value != NULL) {
table->free_value(curr->value);
if (curr == table->buckets[hc]) {
table->buckets[hc] = curr->next;
free(curr->key);
free(curr);
curr = NULL;
(table->key_count)--;
return SUCC;
}
prev->next = curr->next;
free(curr->key);
free(curr);
curr = NULL;
(table->key_count)--;
return SUCC;
} else {
if (curr == table->buckets[hc]) {
table->buckets[hc] = curr->next;
free(curr->key);
free(curr);
curr = NULL;
(table->key_count)--;
return SUCC;
}
prev->next = curr->next;
free(curr->key);
free(curr);
curr = NULL;
(table->key_count)--;
return SUCC;
}
}
prev = curr;
curr = curr->next;
}
}
if (found == 0) {
return FAIL;
}
return SUCC;
}
我不确定它为什么这么说。这是我的 put() 方法:
/* Puts a key value pair in. If the key exists, the value is updated, otherwise the pair is added. */
int put(Table *table, const char *key, void *value) {
unsigned int hc = 0;
Bucket *curr;
Bucket *new_bucket;
char *copy_key;
if (table == NULL || key == NULL) {
return FAIL;
}
copy_key = malloc(sizeof(strlen(key) + 1));
if (copy_key == NULL) {
return FAIL;
}
strcpy(copy_key, key);
hc = hash_code(key)%(table->table_size);
if (table->buckets[hc] != NULL) {
curr = table->buckets[hc];
while (curr != NULL) {
if (strcmp(curr->key, key) == 0) {
if (curr->value != NULL && value != NULL) {
table->free_value(curr->value); /* Getting the invalid free error here again */
}
curr->value = value;
free(copy_key);
return SUCC;
}
curr = curr->next;
}
curr = table->buckets[hc];
new_bucket = malloc(sizeof(*new_bucket));
if (new_bucket == NULL) {
free(copy_key);
return FAIL;
}
new_bucket->value = value;
new_bucket->key = copy_key;
new_bucket->next = curr;
table->buckets[hc] = new_bucket;
(table->key_count)++;
return SUCC;
} else if (table->buckets[hc] == NULL) {
new_bucket = malloc(sizeof(*new_bucket));
if (new_bucket == NULL) {
free(copy_key);
return FAIL;
}
new_bucket->value = value;
new_bucket->key = copy_key;
table->buckets[hc] = new_bucket;
table->buckets[hc]->next = NULL;
(table->key_count)++;
return SUCC;
}
free(copy_key);
return FAIL;
}
任何帮助,将不胜感激。谢谢你。