C++运行报Debug Assertion Fail(vector下标越界)错误求排查
错误根因定位
你遇到的越界错误并非来自result容器,而是来自对b容器的非法访问,你认为a[i]、b[j]无越界是误判,问题出在以下代码的执行顺序:
if (a[i] + b[j] >= check) { j++; plate2++; result.push_back(make_pair(a[i], b[j])); }
执行逻辑拆解:
- 进入分支前你通过
if (j > b.size() - 1) { break; }保证了此时j是合法下标 - 但你先执行了
j++操作,再访问b[j]:如果进入分支时j已经是b的最后一个合法下标(值为b.size()-1),j++后j的值就等于b.size(),超出了vector下标合法范围(vector合法下标区间为[0, size()-1]),直接触发越界断言。
删除result.push_back行后错误消失的原因:删除该行后你即使执行了j++,也没有再访问b[j],不会触发越界访问的检测逻辑,因此不会报错。
修复方案
调整j++的执行顺序,放在访问b[j]之后即可:
if (a[i] + b[j] >= check) { plate2++; result.push_back(make_pair(a[i], b[j])); j++; // 完成元素访问后再自增下标 }
额外注意事项
你代码中input函数的形参n为int类型,但main函数中传入的n、m是long类型,当输入的数组长度超过int取值范围时会发生截断,建议将input函数的形参n改为long类型规避潜在风险。
内容的提问来源于stack exchange,提问作者Thanh Minh Lê
相关产品推荐
相关产品推荐

