【问题标题】:When to free node in linked list何时释放链表中的节点
【发布时间】:2013-03-26 23:36:12
【问题描述】:

当我在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 

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

【问题讨论】:

  • 当你完成使用它。在这种情况下,你还没有完成使用它——即使你已经完成了循环。如果你 free 它,那么 tailhead(例如)现在指向垃圾,因为对象一直是 freed。
  • 释放内存后不能再次引用它,因为内容是未定义的。在完成列表所需的操作(我想打印它)之后,然后遍历列表,沿途释放每个节点。
  • 非常重要:FLUSH; 是什么?

标签: c linked-list free


【解决方案1】:

假设您预定了一个本地会议室,您计划在此举行会议和聚会。你什么时候会释放你的预订...在你预订之后,在你开会之后但在你开派对之前,或者在你开完会和派对之后?

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);
    }
}

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

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 2013-07-23
    • 2011-09-19
    • 1970-01-01
    • 2019-10-28
    • 2018-06-03
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多