【问题标题】:Why using free like this in singly linked list?为什么在单链表中使用这样的免费?
【发布时间】:2021-11-17 16:17:44
【问题描述】:
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”?

【问题讨论】:

  • 因为那本书的作者秘密地传达了他们的信念,即更多的代码 = 更好的代码?那行代码绝对没有理由,你注意到了;道具。以此为燃料来审查该作者的其他代码。不相关的p-=L->head; 甚至不是有效代码,但我认为这是一个错字(为了将来参考,当您复制+粘贴工作代码而不是手动时,错字是不可能 - 在 SO 编辑器中输入未编译、未经测试的代码)。
  • p-=L->head 有什么问题?
  • p-=L->head 是我的错字。对不起

标签: c linked-list free singly-linked-list


【解决方案1】:

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

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

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

在你的例子中说,不管出于什么原因,另一个指针引用了链表节点,它试图访问例如next 成员,它不能再意外地仍然工作。

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

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

【讨论】:

    猜你喜欢
    • 2018-07-06
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多