链表删除下一个节点函数中free语句引发程序崩溃,求排查原因
排查
remove_next_node中free(temp_ptr)崩溃的问题 常见崩溃原因及排查方向
1. 重复释放内存
- 确认
temp_ptr指向的节点是否已经被释放过:- 检查链表操作的其他逻辑,是否存在对同一节点多次调用
free的情况(比如删除节点后未将指针置空,后续误操作再次释放)。 - 查看CSV数据解析完成后,是否有提前释放部分节点但未更新链表指针的情况。
- 检查链表操作的其他逻辑,是否存在对同一节点多次调用
2. 释放非堆内存
- 验证
temp_ptr指向的节点是否通过malloc/calloc/realloc分配:- 如果节点是栈上局部变量、全局变量或字符串常量,调用
free会直接触发崩溃。检查CSV解析时的节点创建代码,是否存在将栈内存地址赋值给链表节点指针的错误。
- 如果节点是栈上局部变量、全局变量或字符串常量,调用
3. 野指针访问
- 检查
temp_ptr是否为野指针:- 链表节点被删除后,相关指针未置空,后续误操作该野指针并调用
free。 - CSV加载过程中如果出现解析错误,导致节点指针未初始化就传入
remove_next_node。
- 链表节点被删除后,相关指针未置空,后续误操作该野指针并调用
4. 链表结构被破坏
- 核对
remove_next_node的逻辑是否存在结构破坏:- 例如,获取
temp_ptr = current->next后,current->next被提前修改,导致temp_ptr指向的内存被篡改。 - 若存在多线程操作,需确认是否有并发修改链表的情况,导致
temp_ptr指向的内存失效。
- 例如,获取
具体排查操作
- 在
free(temp_ptr)前打印指针地址,确认是否为有效地址:printf("temp_ptr addr: %p\n", temp_ptr); free(temp_ptr); - 检查
remove_next_node的边界处理:必须先判断current->next是否为NULL,避免对空指针或非法指针执行free。示例修正逻辑:void remove_next_node(Node *current) { if (current == NULL || current->next == NULL) { return; // 边界判断,避免非法访问 } Node *temp_ptr = current->next; current->next = temp_ptr->next; free(temp_ptr); temp_ptr = NULL; // 释放后置空,避免野指针 } - 验证CSV加载后的所有节点是否正确分配:检查
malloc的返回值,确保没有分配失败的节点被传入释放逻辑。
内容的提问来源于stack exchange,提问作者Sam Stan
相关产品推荐
相关产品推荐

