LeetCode24两两交换链表节点删除旧链表出现heap-use-after-free错误
错误含义
你遇到的heap-use-after-free是地址消毒工具(AddressSanitizer)给出的内存错误提示,含义是程序访问了已经被释放的堆内存空间。从报错附带的shadow字节信息也可以验证:报错地址对应的shadow值为fd,对照说明正好属于已释放的堆内存区域。
触发原因
LeetCode的判题框架会统一管理所有测试用例的内存:输入的原始链表由框架创建,在你的函数执行完毕、判题逻辑结束后,框架会自动回收原始链表的内存。
你在函数内部提前删除了原始链表的所有节点,等框架后续回收原始链表时,访问的都是已经被你释放的内存,自然就触发了释放后使用的错误。你注释掉删除旧链表的代码后,框架可以正常回收内存,程序就可以正常运行。
解决方案
方案1:直接删除释放旧链表的代码(最推荐)
LeetCode判题属于单次程序运行,即使你不手动释放旧链表,程序退出后系统也会自动回收所有进程内存,完全不会有问题。删除掉你写的旧链表释放逻辑即可。
方案2:调整逻辑不新建链表(无额外内存开销)
如果你有严格的内存回收习惯,也可以选择修改实现思路,直接在原链表上交换节点值,不需要新建链表也不需要额外的内存释放操作:
class Solution { public: ListNode* swapPairs(ListNode* head) { auto p = head; while(p && p->next) { swap(p->val, p->next->val); p = p->next->next; } return head; } };
内容的提问来源于stack exchange,提问作者sanyam jain
相关产品推荐
相关产品推荐

