C程序malloc内存无法正确释放 Address Sanitizer报内存泄漏
内存泄漏原因
你在解析门电路输出节点的逻辑中,遇到不存在于names数组的节点名时,会动态扩容names数组并为新节点分配内存,这部分新增节点的数量由变量tcount记录,对应的数组索引范围是[icount + ocount + 2, size - 1]。你现有的内存释放逻辑仅覆盖了固定分配的names[0]、names[1],以及输入输出对应的icount + ocount个节点,完全没有释放动态新增的tcount个节点的内存。即便你放开注释中的free(names[size-1]),也仅能释放最后一个新增节点,新增多个节点时仍然存在泄漏。
修复方法
直接替换原有的分散释放names元素的代码,改为遍历整个names数组释放所有元素,避免遗漏:
// 替换原有分别释放names[0]、names[1]、输入节点、输出节点的代码 for (int i = 0; i < size; i++) { free(names[i]); }
这种写法不需要区分节点类型,不管后续有没有新增扩容逻辑,都能保证所有分配的字符串内存被正确释放。
内容的提问来源于stack exchange,提问作者user17452269
相关产品推荐
相关产品推荐

