我试图释放一个双重链表。这是我用的函数。
static void clean_list(particles * plist)
{
particles *n_list = plist;
particles *temp_nlist;
while(n_list){
temp_nlist = n_list->next;
free(n_list);
n_list = temp_nlist;
}
}
当我尝试在程序中调用这个函数时,程序挂起而没有从这个函数返回。有几件事需要注意:plist是一个双链表,有一个prev
,一个next
,一个指向结构体的指针,这个结构体又有int和double作为数据,一个链表本身是成员数据。你认为plist有指向其他数据的指针,它会挂起吗?在这种情况下,我甚至可以释放指针,并在plist成员的链表上运行相同的clean_list
。我试着四处寻找解决办法,但没有找到。请帮助。
我同意其他评论者的看法,这个问题需要更多关于问题初始条件的信息,然后才能正确回答。然而,一个导致代码失败的场景立即浮现在脑海中。
假设plist是一个有三个元素的循环链表:a <-> B <-> C <-> a, plist指向a。
当你的代码运行时,它会:释放A,前进到B,释放B,前进到C,释放C,然后前进到释放的内存,这是A。(或永远运行)因为它是一个双链表,你应该使用你之前的链接来清空你的下一个链接,然后再去分配。另外,也要清空你的前一个链接。
temp_nlist = n_list->next;
temp_nlist->prev = NULL;
if (n_list->prev != NULL) n_list->prev->next = NULL;
free(n_list);
n_list = temp_nlist;
这可能不是函数本身的问题,而是它的剩余部分,头,尾或prev指针没有被清理。
请尝试在gdb中执行您的程序,让它崩溃并查看反向跟踪(bt)。我相信它会让你更好地理解发生了什么。跟踪完成后,请将其与您的一些代码一起发布。