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

为何访问std::vector越界时未触发out_of_range异常?

为何访问std::vector越界时未触发out_of_range异常?

这是个特别常见的新手疑惑,结合你的代码和环境,我来给你讲明白核心原因~

你代码里用的是std::vector的下标运算符[],C标准对这个运算符的设计逻辑是「性能优先」——它不会自动执行边界检查,哪怕你明显越界访问了,也不会主动抛出std::out_of_range异常。你看到的5 -> 0其实是越界访问了容器末尾之后的内存,这属于C里的「未定义行为」:这次碰巧输出了0,换个场景可能直接程序崩溃,或者出现更诡异的结果,完全没有规律可言。

至于你在Bjarne Stroustrup的《Programming: Principles and Practice Using C++》里看到的「越界会抛出out_of_range异常」,对应的其实是std::vector的另一个成员函数——at()。这个函数是专门为安全访问设计的,每次调用都会严格检查索引是否在合法范围内,一旦越界就会抛出std::out_of_range异常,正好能被你写的catch块捕获。

针对你的代码,只需要做一个小修改就能看到预期的效果:把循环里的items[i]替换成items.at(i),重新用clang++ -std=c++20 main.cpp编译运行,当循环到i=5的时候,程序就会触发你预期的异常,控制台会输出「Range error!」,而不是现在的错误结果+「Success!」了。

另外给你个调试阶段的小技巧:如果你只是想在开发时让下标运算符也做边界检查,你用的Mac默认Clang搭配的LLVM libc++库,支持通过编译选项开启调试模式——编译时加上-D_LIBCPP_DEBUG,比如:

clang++ -std=c++20 -D_LIBCPP_DEBUG main.cpp

开启后[]也会做边界检查并抛异常,但这属于编译器扩展的非标准功能,正式发布的代码千万别用,会大幅降低程序性能。

备注:内容来源于stack exchange,提问作者Andrey Bushman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 02:54:50