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

C++中vector异常行为:新手请教下标与at()方法差异原因

关于C++ Vector越界访问的问题解析

嘿,这个问题刚好戳中了C++ vector中operator[]和at()两个方法的核心差异,咱们一步步拆解来搞懂底层到底发生了什么:

先明确当前vector的初始状态

你写的vec={2,3,4};这段代码,会创建一个size为3的vector,也就是说它只包含3个有效元素,对应的合法索引是0、1、2——根本不存在索引3的位置。

为什么第一个for循环(用[])能"输出"9?

这其实是一种未定义行为的巧合,而非真的"正常工作":

  • C++标准规定,vector::operator[](就是你用的方括号)不做任何边界检查。它只会根据索引直接计算内存地址,返回对应位置的引用,完全不管这个地址是不是属于vector的有效元素范围。
  • 你执行vec[3]=9;时,其实是往vector尾部的内存之外写了一个值,这块内存不属于vector管理,可能是其他变量的空间,也可能是空闲内存。你第一个for循环用[]访问索引3,只是刚好读到了之前写在那块内存的9,但这种行为是不可靠的——换个编译器、换个运行环境,程序可能直接崩溃,或者输出莫名其妙的数值。

为什么第二个for循环(用at())会失败?

vector::at()的设计就是用来做安全访问的:

  • 每次调用at()时,它都会先检查传入的索引是否在0到size()-1的范围内。如果超出范围,它会直接抛出std::out_of_range异常(如果没有捕获这个异常,程序就会终止运行)。
  • 在你的代码里,vector的size是3,最大合法索引是2,所以at(3)触发了边界检查,直接报错,这才是符合预期的安全行为。

为什么初始有4个元素就没问题?

如果初始vector是{2,3,4,5},那它的size就是4,合法索引范围是0-3。这时候vec[3]和vec.at(3)都是访问第四个有效元素,完全在vector的管理范围内,自然不会有越界问题。

正确的写法建议

如果你想给vector添加新元素,不要直接用索引赋值,应该用vector提供的添加元素方法:

vec={2,3,4};
vec.push_back(9); // 或者 vec.emplace_back(9);

这样vector会自动扩容,把9作为第四个有效元素加入,size变成4,此时不管用[]还是at()访问索引3,都是完全合法的操作。

最后再提醒一句:新手阶段尽量优先用at(),它能帮你快速发现越界问题;如果追求性能且能确保索引合法,再用[]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:01:34