C语言WordNode与Node结构体释放逻辑完整性及内存泄漏原因排查
问题1:释放逻辑本身是否能完整释放结构体内存
你编写的freeWordNode和freeNode函数逻辑是正确的,只要满足以下两个条件就能完整释放所有相关结构体的内存:
- 所有创建的
Node实例都被挂载到你调用freeNode时传入的根链表中 - 所有
WordNode实例要么被挂载到某个Node的children/parents/commands成员链表中,要么你单独为其调用了freeWordNode释放
问题2:内存泄漏是否和结构体无关
内存泄漏和这些结构体直接相关,并非无关代码导致。结合valgrind的调用栈可以定位泄漏的三个来源:
makeNode分配的1块Node泄漏:说明你有至少1个创建出来的Node没有被插入到传入freeNode的根链表里,freeNode遍历的时候无法找到这个孤立节点,因此没有释放addToVisted分配的WordNode泄漏:这个函数用于维护后序遍历的已访问节点链表,这个链表是独立于Node结构体的三个WordNode成员存在的,你没有在程序结束前单独调用freeWordNode释放这个独立链表,导致整个链的内存全部泄漏makeTargetStrAndDepStrs分配的内存泄漏:你补充说明该函数仅在calloc返回NULL时释放已创建节点,若函数正常执行过程中创建的部分WordNode没有被正确挂载到对应Node的成员链表中,这些节点也不会被freeNode流程识别,进而泄漏
排查方案
你可以按照以下顺序定位修复问题:
- 遍历所有
makeNode的调用点,确认每个创建的Node都被正确插入到最终要释放的Node根链表中,不存在孤立的Node实例 - 找到
addToVisted操作的已访问链表头指针,在程序执行完后序遍历逻辑后,单独调用freeWordNode释放这个链表 - 检查
makeTargetStrAndDepStrs的正常执行路径,确认所有在该函数内分配的WordNode都被挂载到对应Node的对应成员上,没有残留未关联也未释放的临时节点
内容的提问来源于stack exchange,提问作者carlosdafield
相关产品推荐
相关产品推荐

