释放双重链表 - 挂起

时间:2011-10-16 19:09:43

标签: c list linked-list free

我正试图释放双重链表。这是我正在使用的功能。

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。我试图寻找解决方案,但我没有找到任何解决方案。请帮忙。

2 个答案:

答案 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)。我相信它会让你更好地了解最新情况。获得跟踪后,请将其与一些代码一起发布。