如何修复这段C90矩阵路径搜索代码中的newPath内存泄漏?
修复BFS矩阵最短路径的内存泄漏问题
问题根源
初始队列节点的路径未通过malloc分配内存,但后续入队节点的路径都调用newPath(内部包含malloc)分配了内存。出队时所有节点的路径都执行free(path),但初始节点的路径并非堆内存,导致实际free次数比malloc少1次——初始节点的free操作无效,而有一块通过newPath分配的路径内存未被释放。
修复方案
给初始节点的路径也分配合法的堆内存,确保所有出队节点的路径都对应一次malloc调用:
- 初始化队列节点时,不再用空指针或静态数组作为路径,而是调用
newPath为初始节点分配路径空间,把起始坐标存入路径。 - 保持后续节点入队前调用
newPath复制并扩展路径的逻辑不变。 - 出队时,所有节点的路径都可以安全执行
free操作,此时malloc和free的次数完全匹配,不会出现内存泄漏。
代码示例片段
// 初始化起始节点 Node* startNode = (Node*)malloc(sizeof(Node)); startNode->x = startX; startNode->y = startY; // 为初始路径分配内存,替代原来的无分配逻辑 startNode->path = newPath(NULL, startX, startY); // newPath需处理NULL输入,生成仅含起始点的路径 startNode->next = NULL; enqueue(queue, startNode);
注意事项
- 确保
newPath函数能够处理输入路径为NULL的情况,正确分配内存并写入起始坐标。 - 所有入队节点的路径都必须通过
malloc分配,出队时逐个free,避免混合使用栈内存/静态内存和堆内存的路径指针。
内容的提问来源于stack exchange,提问作者Jacopo V
相关产品推荐
相关产品推荐

