You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中哨兵节点(Dummy Node)的内存管理疑问

链表哨兵节点的析构问题解答

核心结论

如果给ListNode定义了递归删除next指针的析构函数,dummy销毁时会触发析构函数,递归删除其next指向的整个链表,导致返回的dummy.next直接失效,变成野指针。

具体过程拆解

  • 当test函数执行结束,栈上的dummy对象会被销毁,自动调用它的析构函数。
  • 析构函数里的delete next会释放dummy.next指向的节点(也就是传入的原链表头),同时这个节点的析构函数又会触发它自己的next节点的删除,以此递归,直到整个链表的堆内存被全部释放。
  • 这时候函数返回的dummy.next指向的内存已经被回收,后续访问这个指针属于未定义行为,大概率会导致程序崩溃或异常。

LeetCode上能正常运行的原因

你在LeetCode里这么用没问题,本质是因为LeetCode的ListNode用的是默认析构函数——默认析构只会销毁ListNode对象本身,不会主动去删除它的指针成员next。所以dummy销毁时,只是它自己的栈内存被回收,它的next指向的链表节点还好好待在堆上,返回的指针自然有效。


内容的提问来源于stack exchange,提问作者LukeWu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:58:20