我正在用單鏈表編碼一個哈希表,我遇到了這個問題,free(): double free detected in tcache 2我試圖修復它,但沒有成功,問題是free(),所以你能解釋我為什么有它,所以如果有人可以幫忙,所以請幫忙我,我現在正試圖修復它幾個小時......謝謝。
我在 youtube 上看過一些視頻,在網站上看過很多主題,也在這里看過,但我沒有找到適合我的解決方案。
這是我的功能:
/**** c file */
/*
some functions here
.
.
.
*/
strhash_table * strhash_table_destroy(strhash_table * table)
{
unsigned int i;
super_list *list;
s_node *node;
for (i = 0; i < table->len; i ) {
list = table->list i;
for (node = list->node; node != NULL; node = node->next) {
free(node->data);
}
list_destroy(list->node);
}
free(table->list);
free(table);
return table;
}
strhash_table * strhash_table_free(strhash_table * table)
{
unsigned int i;
super_list *list;
for (i = 0; i < table->len; i ) {
list = table->list i;
if (list->len > 0) {
free(list->node->data);
list_destroy(list->node);
list->len = 0;
return table;
}
}
return table;
}
strhash_table * strhash_table_remove(strhash_table * table, char * str)
{
const int index = hashCode(str, table->len);
if (table->list[index].len == 0) return table;
s_node *find_node;
const int result = list_process(table->list[index].node, &find_str_node, str, &find_node);
if (result == 1) {
free(find_node->data);
table->list[index].node = list_remove(table->list[index].node, find_node->data);
table->list[index].len--;
}
return table;
}
/**** test file */
strhash_table * test_init(const unsigned int len)
{
strhash_table * table = strhash_table_init(len);
if (!table) {
printf(RED"Tha HashTable hasn't been created\n"reset);
assert(0);
}
printf(GRN"***Tha HashTable has been created***\n"reset);
return table;
}
strhash_table * test_destroy(strhash_table * table){
table = strhash_table_destroy(table);
if (table->list->node) {
printf(RED"The HashTable hasn't been destroyed (%p)\n"reset, table->list->node);
assert(0);
}
printf(GRN"The HashTable has been destroyed\n"reset);
return NULL;
}
int main(void)
{
strhash_table * table =strhash_table_init(10);
strhash_print(table);
strhash_table_add(table, "ele1");
strhash_table_add(table, "ele2");
strhash_table_add(table, "ele3");
strhash_table_add(table, "ele4");
strhash_table_add(table, "ele5");
//strhash_table_remove(table,"ele1");
//strhash_table_free(table);
test_destroy(table);
return 0;
}
提前謝謝你^^
uj5u.com熱心網友回復:
您應該移到list_destroy(list->node);內部回圈之外。您在迭代節點鏈接的回圈中多次釋放節點串列。
這是一個修改后的版本:
strhash_table *strhash_table_destroy(strhash_table *table) {
unsigned int i;
super_list *list;
s_node *node;
for (i = 0; i < table->len; i ) {
list = table->list i;
for (node = list->node; node != NULL; node = node->next) {
free(node->data);
}
list_destroy(list->node);
}
free(table->list);
free(table);
return table;
}
void list_destroy(s_node *head) {
while (head) {
head = list_headRemove(head);
}
}
s_node *list_headRemove(s_node *head) {
if (!head) return head;
s_node *n = head->next;
free(head);
return n;
}
更新
在代碼張貼,存在沖突的功能的版本list_destroy和list_headRemove,此外有2個呼叫free(node);在第二功能list_destroy,這兩者都是無用的,因為node是一個空指標時while退出回圈。
更新 2
有一個問題strhash_table_free:你釋放了list->node但你沒有更新list->node,所以串列在沒有測驗的strhash_table_destroy地方第二次釋放list->len。
該場len在super_list似乎是多余的。您應該只測驗node成員是否存在NULL并將其設定NULL為釋放串列時。
uj5u.com熱心網友回復:
在我看來,假設您不重復使用list_headRemove和list_headRemove:
strhash_table *strhash_table_destroy(strhash_table *table) {
unsigned int i;
super_list *list;
s_node *node, *next;
for (i = 0; i < table->len; i ) {
list = table->list i;
node = list->node;
while (node) {
next = node->next;
free(node->data);
free(node);
node = next;
}
}
free(table->list);
free(table);
return table; /* This pointer is not valid anymore be careful */
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368922.html
