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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:15:05