You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言链表创建节点时出现Leak_DefinitelyLost警告的解决咨询

解决链表节点内存泄漏与SIGSEGV崩溃问题

问题根源

  1. 内存泄漏原因:

    • 删除头节点时,直接丢弃原头节点,未释放其内部data和节点结构体内存
    • 删除中间/尾节点时,仅修改链表指针,未释放目标节点的data和节点(注释free(dummy)导致泄漏)
    • 原Delete_node未处理尾节点的删除逻辑
  2. SIGSEGV崩溃原因:
    取消free(dummy)注释后崩溃,核心是原代码仅释放节点结构体,未先释放其内部data指针指向的堆内存;同时删除头节点时未释放内存,若后续程序存在访问已失效指针的逻辑,也会触发段错误。

修复方案

1. 修复Delete_node函数

以下是兼顾删除逻辑、内存释放和避免崩溃的正确实现:

struct node* Delete_node(struct node* head, char* to_delete){
    struct node *p, *to_free;

    // 处理头节点删除
    if (head != NULL && strcmp(head->data, to_delete) == 0) {
        to_free = head;
        head = head->next;
        free(to_free->data); // 先释放内部字符串内存
        free(to_free);       // 再释放节点结构体
        return head;
    }

    p = head;
    // 遍历查找目标节点(处理中间/尾节点)
    while (p != NULL && p->next != NULL) {
        if (strcmp(p->next->data, to_delete) == 0) {
            to_free = p->next;
            p->next = to_free->next; // 跳过要删除的节点
            free(to_free->data);     // 释放内部字符串
            free(to_free);           // 释放节点
            break;
        }
        p = p->next;
    }

    return head;
}

2. 确保正确使用释放函数

  • 删除单个节点:调用Delete_node后,必须用返回值更新链表头指针,示例:
    head = Delete_node(head, "target_string");
    
  • 释放整个链表:程序结束或不再需要链表时,调用Free_All(head),该函数递归释放逻辑正确,能完整释放所有节点的data和结构体内存。

3. 验证修复效果

修复后重新用Valgrind检测,Leak_DefinitelyLost错误应消失;删除节点操作不会再触发SIGSEGV崩溃。

额外优化建议

在NewNode中添加内存分配失败的检查,避免空指针操作:

struct node* NewNode(char* to_insert) {
    struct node *new_node = malloc(sizeof(*new_node));
    if (new_node == NULL) return NULL;

    new_node->data = malloc(strlen(to_insert) + 1);
    if (new_node->data == NULL) {
        free(new_node); // 分配data失败时,先释放已分配的节点
        return NULL;
    }

    strcpy(new_node->data, to_insert);
    new_node->next = NULL;
    return new_node;
}

内容的提问来源于stack exchange,提问作者cheeroke_69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:20:32