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

