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

