C语言 为什么在单链表中使用这样的free ?


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未设置为NULL,程序将更容易受到use-after-free错误的影响。它将更多地依赖于内存分配的具体实现以及系统保护。

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

对于使用默认malloc和朋友的正常程序,这是一个好的内存调试器无法捕获的。但在某些情况下,"清理"是一种很好的做法。已使用的内存。

假设在你的例子中,无论出于什么原因,另一个指针有一个对链表节点的引用,并且它试图访问例如next成员,它不再可能意外地仍然工作。

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

我宁愿推荐使用内存调试器来捕获严重的错误,或者只在调试构建中添加额外的指令。

最新更新