You need to enable JavaScript to run this app. 带vector入参的ListNode构造函数运行时触发内存溢出异常
优惠活动
大模型
产品
解决方案
定价
更多

带vector入参的ListNode构造函数运行时触发内存溢出异常

内存溢出问题根因定位

你的代码存在两处直接触发空指针访问的致命错误,以及链表构造逻辑的完全实现错误,具体如下:

1. vector版ListNode构造函数实现错误

你编写的构造函数逻辑完全不符合链表初始化的要求:

  • 初始t = nullptr,第一次循环就执行t->val = *itr,直接解引用空指针,这是第一处崩溃点。
  • 全程没有通过new分配新节点内存,也没有串联节点的next链路,就算修正空指针问题,也只会反复修改同一块内存的数值,不会生成多个独立的链表节点。
  • 构造函数本身的作用是初始化当前ListNode实例,但你连当前实例的val、next成员都没有做初始化。

正确的构造逻辑(适配非空vector的初始化场景):

ListNode(vector<int> array)
{
    // 先把当前实例初始化为链表头节点
    this->val = array[0];
    this->next = nullptr;
    ListNode *tail = this; // 用尾指针跟踪链表末尾,避免重复遍历

    // 从vector第二个元素开始,逐个创建新节点挂载到链表尾部
    for (size_t i = 1; i < array.size(); i++) {
        tail->next = new ListNode(array[i]);
        tail = tail->next;
    }
}

若需兼容空vector的初始化场景,需要额外加array.empty()的边界判断,避免数组越界访问。


2. main函数内Solution指针空引用问题

你在main中编写的逻辑:

Solution *sol = nullptr;
...
sol->addTwoNumbers(list1,list2);

sol本身是未分配内存的空指针,直接调用其成员函数属于未定义行为,会直接触发内存访问异常,这是第二处崩溃点。
正确写法可以二选一:

  • 直接在栈上创建实例:
    Solution sol;
    ListNode *res = sol.addTwoNumbers(list1, list2);
    
  • 给指针分配堆内存:
    Solution *sol = new Solution();
    ListNode *res = sol->addTwoNumbers(list1, list2);
    

3. 其他可优化的逻辑问题

  • 原构造函数中用迭代器做<比较的写法,仅适用于vector的随机访问迭代器,通用性较差,更稳妥的写法是用itr != array.end()做循环终止判断。
  • 代码中所有通过new创建的链表节点没有配套的释放逻辑,长期运行会造成内存泄漏,当前测试用例下不影响运行结果。

修复后测试结果

修正上述两处致命错误后,你的测试用例可正常运算,输出链表[7,0,8],对应结果807,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 22:36:03