버킷 포인터의 배열 인 해시 테이블이 있습니다 (이 프로젝트에서는 버킷이라고 함). 해시 테이블은 충돌을 피하기 위해 연결된 목록 체이닝을 사용합니다.Valgrind에서 잘못된 오류 메시지가 나타납니다.
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의 라인에서 나에게 잘못된 무료() 오류 메시지를주고있다 : : 방법에 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;
}
아무 도움이됩니다. 고맙습니다.
나는 완전한 valgrind 오류를 주신 것으로 생각하지 않습니다. Invalid Free는 여러 가지 종류가 있습니다 (결코 할당되지 않은 포인터는 두 번 사용하지 말고 머리글/예고편은 손상됨). – abelenky