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

Valgrind报告Blocks Are Definitely Lost但已执行free操作的问题排查

问题根因

泄漏发生在查询的标签对应0个结果的场景,具体逻辑漏洞如下:

  • 当*numOfSegments计算结果为0时,你依然执行了malloc(sizeof(int)*0),C标准允许malloc(0)返回非空的合法指针(仅不可解引用),此时这两个0字节的内存块地址被存在imageArr和segArr中。
  • 后续你直接将*images、*segments赋值为nullptr,没有提前释放imageArr和segArr指向的内存,直接丢失了这两个内存块的地址。
  • 上层OnGetAllSegmentssByLabel中free的是被赋值为nullptr的指针,free空指针属于合法无操作,不会释放之前分配的0字节内存,最终导致泄漏,刚好对应Valgrind输出里「总分配数比释放数多2、0字节块泄漏」的特征。

修复方案

二选一即可:

  • 方案1:分配内存前先判断结果数,为0时直接返回,不执行malloc逻辑:
*numOfSegments = Match_Num(image_tree->root, label);
// 新增判断
if (*numOfSegments == 0) {
    *images = *segments = nullptr;
    return SUCCESS;
}
// 原有malloc逻辑保持不变
int *imageArr = (int *) malloc(sizeof(int) * (*numOfSegments));
// ... 后续代码不变
  • 方案2:在把输出指针置空之前,先释放已经分配的内存:
if ((*numOfSegments) == 0) {
    // 新增释放逻辑
    free(imageArr);
    free(segArr);
    *images = *segments = nullptr;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:09:02