C语言循环链表插入节点函数valgrind检测报内存泄漏问题求解
你当前实现的insert_node_at插入函数本身不存在导致内存泄漏的逻辑问题:所有通过malloc申请的节点都正确挂载到了链表结构上,没有出现申请后指针丢失、无法寻址的情况。
valgrind上报的内存泄漏,核心原因是C语言不会自动回收堆内存,你在程序退出前没有主动释放循环链表的所有节点,只要你没有调用free释放申请的内存,哪怕程序运行结束,valgrind也会判定这部分内存泄漏。
你可以实现一个专门的链表释放函数,在整个链表不再需要使用的时候调用即可解决泄漏问题,参考实现如下:
void free_list(list *lst) { // 空链表无需处理直接返回 if (lst == NULL || lst->head == NULL) { return; } node *curr = lst->head; node *next_tmp = NULL; // 循环遍历释放所有节点 do { next_tmp = curr->next; free(curr); curr = next_tmp; } while (curr != lst->head); // 释放完成后头指针置空,避免野指针 lst->head = NULL; }
额外注意事项
- 当前插入函数没有判断
malloc返回值,若内存不足malloc返回NULL时,后续对n->data的访问会触发段错误,建议补充判断逻辑,申请失败时直接返回错误,避免程序崩溃。 - 如果你后续实现删除单个节点的功能,要注意把节点从链表上摘除的同时,及时
free对应的节点内存,不要直接丢弃被摘除节点的指针,否则也会出现内存泄漏。
内容的提问来源于stack exchange,提问作者foc
相关产品推荐
相关产品推荐

