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
相关产品推荐
相关产品推荐

