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

C程序内存泄漏排查求助:未释放内存及free函数报错问题咨询

排查C程序未释放内存与free(diagonaly)触发错误的解决方案

我来帮你拆解这个问题的核心,并给出具体的修复方案:

首先,你遇到的free(diagonaly)触发错误,本质是指针未初始化或未分配时就尝试释放。我们仔细看代码逻辑:

  • diagonaly的内存分配只在if(first)分支里执行,而这个分支只有当第一次输入的行通过validni检查时才会触发。
  • 当if(nr<=0)分支触发时,有两种可能:要么用户直接输入了换行(根本没进入过if(first)分支,diagonaly还是初始的野指针),要么输入的行都没通过检查(但这种情况已经在validni失败的分支里释放了内存并return,不会走到这里)。所以你认为“该分支触发时diagonaly已完成分配”的情况其实不存在——只要nr<=0,diagonaly要么是野指针,要么根本没被分配。

具体修复步骤

1. 给指针初始化为NULL,从根源避免野指针

C中未初始化的指针是野指针,直接free会触发未定义行为。声明指针时统一初始化为NULL:

char **diagonaly = NULL; 
char **docasne = NULL; 
char *str = NULL; 

2. 安全修改if(nr<=0)分支的释放逻辑

在这个分支里,只有当diagonaly确实被分配过(不为NULL)时才需要释放,而且因为nr<=0,说明没有任何行(diagonaly[i])被分配,所以不需要释放行:

if(nr<=0 ) { 
    printf("Nespravny vstup.\n"); 
    free(str); 
    // 只释放已分配的diagonaly
    if (diagonaly != NULL) {
        free(diagonaly);
    }
    return 0; 
}

3. 修复其他潜在的内存问题

还有几个容易被忽略的内存泄漏或不安全点:

  • 重复初始化str导致的泄漏:代码中间你直接把str = NULL;,但之前的str已经被getline分配了内存,这会导致内存泄漏。应该先释放再重置:
    free(str);
    str = NULL; 
    capacity = 0; 
    nr=0; 
    
  • realloc失败的错误处理:当前代码中如果realloc返回NULL,会丢失原来的diagonaly指针,造成内存泄漏。必须先检查返回值:
    if (nr==rDiagonaly) { 
        rDiagonaly *= 2; 
        docasne = realloc(diagonaly, rDiagonaly*sizeof(*diagonaly)); 
        // 检查realloc是否成功
        if (docasne == NULL) {
            // 分配失败,先清理已有的内存
            for (int i = 0; i < nr; i++) free(diagonaly[i]);
            free(diagonaly);
            free(str);
            printf("Alokace pameti selhala.\n");
            return 1;
        }
        diagonaly=docasne; 
    }
    
  • 去掉多余的malloc强制类型转换:在C中,malloc/realloc的返回值不需要强制转换,这不仅多余,还可能隐藏stdlib.h未包含的问题。比如:
    diagonaly = malloc(sizeof(*diagonaly)*rDiagonaly); 
    

内存泄漏排查工具推荐

如果之后还有内存泄漏问题,可以用这些工具快速定位:

  • Valgrind:运行valgrind --leak-check=full ./your_program,就能看到详细的内存泄漏、越界访问等错误报告。
  • AddressSanitizer:编译时添加-fsanitize=address参数(GCC/Clang都支持),运行程序时会实时检测内存错误,速度比Valgrind快很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:26:26