我正试图释放双重链表。这是我正在使用的功能。
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
。我试图寻找解决方案,但我没有找到任何解决方案。请帮忙。
答案 0 :(得分:1)
我同意其他评论者的意见,在问题得到正确回答之前,这个问题需要有关问题初始条件的更多信息。但是,会立即想到导致代码失败的情况。
假设plist是具有三个元素的循环链表:A< - > B - < - > C - 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;
答案 1 :(得分:0)
这可能不是函数本身的问题,而是它的剩余部分,头部,尾部或未被清理的prev指针。
请尝试在gdb中执行你的程序,让它崩溃并查看后面的跟踪(bt)。我相信它会让你更好地了解最新情况。获得跟踪后,请将其与一些代码一起发布。