C语言free释放malloc内存失效,地址sanitizer报内存泄漏问题
内存泄漏原因及修复方案
泄漏原因
- 临时节点名内存未释放:你在解析门电路输出节点时,遇到不存在的节点名会动态新增
names数组元素并分配17字节内存存储节点名,这部分临时节点(总计tcount个)的内存你完全没有做释放处理,当前只释放了前2个常量节点、icount个输入节点、ocount个输出节点对应的内存。 - 门电路配置内存批量泄漏:你在循环解析每个门电路时,都会给当前
step的inputs/outputs/selectors三个指针分配内存,然后通过结构体浅拷贝把这三个指针存入temp数组。你当前只释放了最后一次循环用到的局部变量step持有的三块内存,前面scount-1个门电路对应的所有inputs/outputs/selectors内存全部泄漏。 - names指针数组本身未释放:你为
names(char**类型)分配的存储指针的数组内存,最终没有调用free(names)释放。
修复方案
- 替换原来只释放输入、输出节点的代码,直接遍历所有
names元素释放,同时释放names指针数组本身:
// 替换原有的输入、输出节点释放逻辑 for (i = 0; i < size; i++) { free(names[i]); } free(names);
- 在释放
temp数组之前,遍历所有门电路实例释放动态分配的数组,同时删除原有的free(step.inputs)/free(step.outputs)/free(step.selectors)三行代码,避免重复释放:
// 释放所有门电路的动态内存 for (i = 0; i < scount; i++) { free(temp[i].inputs); free(temp[i].outputs); free(temp[i].selectors); } free(temp);
内容的提问来源于stack exchange,提问作者user17452269
相关产品推荐
相关产品推荐

