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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:39:04