如何在Visual Studio中定位C++的vector subscript out of range错误?
解决Visual Studio中vector下标越界无法定位自身代码的问题
一、调试设置调整,直接定位出错代码
- 开启原生代码调试:右键项目→属性→调试→勾选「启用原生代码调试」(如果是C++/其他语言混合项目)
- 配置异常中断规则:
- 按
Ctrl+Alt+E打开异常设置窗口 - 展开「C++ Exceptions」,勾选
std::out_of_range(嫌麻烦直接勾所有C++异常也行) - 重新启动调试,触发错误时会直接断在你自己代码里触发越界的那一行,不会跳去STL的vector头文件
- 按
二、手动排查的实用小技巧
- 把所有
[]访问换成at():vector.at(index)在越界时会抛出明确异常,调试时直接定位到调用at()的代码行,新手用这个最快 - 加断言做检查:每次访问vector前加
assert(index >= 0 && index < vec.size());,调试模式下越界会直接断在断言行,记得先包含<cassert>头文件 - 调试时监控数值:在「监视」窗口里添加
vec.size()和你用的下标变量,实时看两者数值对不对得上
三、利用调用堆栈跳转到出错代码
如果已经跳去了vector头文件,别慌:
- 按
Ctrl+Alt+S打开「调用堆栈」窗口,里面会显示从你的代码到STL代码的完整调用链 - 双击堆栈里属于你自己项目的条目,直接跳转到触发越界的代码行
- 如果调用堆栈显示不全,右键项目→属性→C/C++→优化→把「优化」改成
禁用(/Od),重新编译后调试就能看到完整堆栈
内容的提问来源于stack exchange,提问作者davidusw
相关产品推荐
相关产品推荐

