c - 为什么在单链表中使用这样的免费?
问题描述
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
,程序将更容易出现释放后使用错误。它将更多地依赖于内存分配的具体实现以及系统保护。
通过设置指向NULL
程序的指针更有可能发生硬崩溃,这在许多情况下优于访问释放的内存。使用自定义内存分配器,这可能更加正确,因为内存调试器可能并不总是能捕捉到问题,这取决于自定义内存实现。
对于使用默认值malloc
和朋友的普通程序,这不是一个好的内存调试器无法捕捉到的。但是在某些情况下,“清理”不再需要的已用内存是一种很好的做法。
假设在您的示例中,无论出于何种原因,另一个指针引用了链表节点,并且它试图访问例如该next
成员,它不再意外地仍然工作。
但如果这确实是作者的意图,他们应该已经澄清并且可能也memset(p, 0, sizeof *p);
首先执行。因此,我倾向于说这不一定是一种好的做法。
我宁愿建议使用内存调试器来捕获讨厌的错误,或者只在调试版本中添加额外的指令。
推荐阅读
- html - Reply link in email body
- redis - Redis 模块 ReJSON 与 OSS redis
- sql - 具有许多产品类别的站点的数据库设计
- python - 动态 if 循环(业务逻辑)
- json - 他们有什么方法可以在 Solr 中存储嵌套文档吗?
- jquery - How to set timer to a css attribute
- mysql - 从数据库获取响应作为数组而不是单独的对象
- laravel - 从邮递员点击 api url 时出现 404 页面未找到错误
- python - 比较数据框中的两列并更新另一列中的结果
- machine-learning - Vowpal Wabbit 哈希冲突作为正则化比 L1 效果更好