何时释放链表中的节点

时间:2013-03-26 23:36:12

标签: c linked-list free

当我在curr->data输入数据时,我首先通过curr = (NODE*) malloc (sizeof(NODE));分配内存。然后我构建列表,最后在最后打印它。在程序的某个地方,我必须释放我用过的内存,但我不知道该怎么做。构建列表后,或打印列表后?或者我可以这样做吗?

printf("How many elements do you want to make? ");
scanf("%d", &NumElem);
head = NULL;
for (i = 0; i < NumElem; i++)
{
    //memory allocate
    curr = (NODE*)malloc(sizeof(NODE));
    printf("Number %d: ", i+1);
    scanf("%d", &curr->num);
    FLUSH;

    if (head == NULL)/*beginning of the list*/
    {
        curr->next = head;
        head = curr;
        *tail = curr;
    }
    else /*adding on the list*/
    {
        curr->next = head;
        head = curr;
    }
    free (curr);
}//for 

将数据放入当前节点后,每次都可以释放吗?

1 个答案:

答案 0 :(得分:6)

假设您预订了一个本地会议室,您计划召开会议,然后举行派对。您何时会在预订之后,在您参加会议之后但在参加聚会之前,或在您参加了会议和聚会之后立即发布预订?

mallocfree就是这样...... malloc保留一段内存供您使用,free取消预订。如果在取消预订后继续使用内存,则行为未定义。

在您的情况下,您需要释放整个节点列表。您可以在循环中执行此操作,但是有一个共同的陷阱:在访问其next指针之前释放节点。危险在于它几乎总是在实践中起作用,但它是未定义的,有时它不起作用......可能在一些控制生命关键机器的软件中。现在最好学会这样做:

void free_list(NODE* list)
{
    while (list)
    {
        NODE* next = list->next;
        free(list);
        list = next;
    }
}

或者稍微紧凑的形式,

void free_list(NODE* list)
{
    for (NODE* next; list; list = next)
    {
        next = list->next;
        free(list);
    }
}

如果您的节点包含指向malloc并且需要释放的字符串或其他对象的指针,那么这些免费调用将在free_list中完成,然后释放节点本身。