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
相关产品推荐
相关产品推荐

