首页 > 解决方案 > 为什么在单链表中使用这样的免费?

问题描述

typedef struct ListNode{
    char data[4];
    struct ListNode* link;
} listNode;

typedef struct{
    listNode* head;
}linkedList_h;


void freeLinkedList_h(linkedList_h* L){
    listNode *p;
    while(L->head!=NULL){
        p=L->head;
        L->head=L->head->link;
        free(p);
        p=NULL;
    }
}

这是我教科书的示例代码。在freeLinkedList_h中,为什么我们使用“p=NULL”?

标签: clinked-listfreesingly-linked-list

解决方案


如果p未设置为NULL,程序将更容易出现释放后使用错误。它将更多地依赖于内存分配的具体实现以及系统保护。

通过设置指向NULL程序的指针更有可能发生硬崩溃,这在许多情况下优于访问释放的内存。使用自定义内存分配器,这可能更加正确,因为内存调试器可能并不总是能捕捉到问题,这取决于自定义内存实现。

对于使用默认值malloc和朋友的普通程序,这不是一个好的内存调试器无法捕捉到的。但是在某些情况下,“清理”不再需要的已用内存是一种很好的做法。

假设在您的示例中,无论出于何种原因,另一个指针引用了链表节点,并且它试图访问例如该next成员,它不再意外地仍然工作。

但如果这确实是作者的意图,他们应该已经澄清并且可能也memset(p, 0, sizeof *p);首先执行。因此,我倾向于说这不一定是一种好的做法。

我宁愿建议使用内存调试器来捕获讨厌的错误,或者只在调试版本中添加额外的指令。


推荐阅读