C语言括号匹配程序报LeakSanitizer内存泄漏错误如何解决?
内存泄漏原因分析
你代码的内存泄漏来自提前返回时未清理栈中剩余节点,具体问题点:
- 当表达式遍历过程中遇到「栈空时出现右括号」「括号类型不匹配」两种错误场景时,你直接
return 0退出函数,此时栈中已分配的节点没有被释放,直接造成泄漏。 - 你在栈非空的分支里写的第二个
while(stack!=NULL) pop(&stack);是无效代码:第一个while循环已经通过pop操作把stack指针置为NULL了,第二个循环永远不会执行,不过这部分不是泄漏的核心原因。
修复方案
步骤1:新增栈清理辅助函数
void freeStack(struct sNode** top_ref) { while (*top_ref != NULL) { pop(top_ref); } }
步骤2:所有提前返回的位置先清理栈
修改areBracketsBalanced函数里的两个错误返回分支:
if (stack == NULL){ printf("%d: %c\n",i,exp[i]); freeStack(&stack); // 新增栈清理逻辑 return 0; }else if (!isMatchingPair(pop(&stack), exp[i])){ printf("%d: %c\n",i,exp[i]); freeStack(&stack); // 新增栈清理逻辑 return 0; }
步骤3:删除无效的二次清理代码
把栈非空分支里的冗余代码删掉即可:
// 可删除该段代码,前面的while已经把栈节点全部释放 // while(stack!=NULL){ // pop(&stack); // }
可选优化:补全main函数返回值
你的main函数在argc<=1的时候没有显式返回值,建议补充规范返回逻辑:
int main(int argc, char* argv[]){ if(argc>1){ int n = areBracketsBalanced(argv[1]); if(n==0){ return EXIT_FAILURE; }else if(n==1){ return EXIT_SUCCESS; } } return EXIT_FAILURE; // 补充无入参时的返回值 }
修改后所有动态分配的节点都会在退出前通过pop里的free释放,不会再触发内存泄漏报错。
内容的提问来源于stack exchange,提问作者user15409086
相关产品推荐
相关产品推荐

