C++链表表头插入节点函数末尾delete temp引发无限循环问题
问题原因解析
核心逻辑错误
你当前代码中delete temp的释放时机完全错误,问题根源如下:
- 你通过
new Node()申请的内存,本身就是要作为链表的新节点长期驻留使用的,temp只是指向这块新内存的临时指针,而非需要即时释放的临时内存载体。 - 执行
*head = temp语句后,链表的头指针已经指向了这块新申请的内存,说明这块内存已经被链表正式持有、处于使用状态。此时执行delete temp会直接释放链表头节点正在使用的内存,这块内存会变为不可控的野内存。
无限循环的触发原因
被释放的内存已经归还给系统,存储的内容都是未定义的垃圾值,当你后续遍历链表时:
头指针指向的是已被释放的野内存,其中存储的next指针值是随机的,大概率会出现next指向自身、或者指向已经遍历过的节点的情况,最终导致遍历逻辑进入死循环。
正确的内存释放规则
链表节点的内存释放,需要在节点不再被链表持有时执行:
- 单个节点删除场景:先把目标节点从链表中脱链,再执行
delete释放对应内存 - 链表销毁场景:遍历所有节点,逐个脱链后释放内存
你当前头插节点完成后就释放新节点的操作,等价于刚把节点加入链表就直接销毁,必然会引发运行异常,注释掉delete temp的逻辑才是正确的,该位置不存在内存泄漏问题。
内容的提问来源于stack exchange,提问作者Gaurav Singh
相关产品推荐
相关产品推荐

