超出size()和容量()的C++访问向量

Tru*_*uLa 1 c++ vector

data()[i]对于i矢量size()和矢量下的索引,访问矢量是否安全capacity()

这是我的推理:

a)根据cplusplus,capacity()是"当前为矢量分配的存储空间的大小",这让我觉得我的问题的答案是YES,但是

b)使用reserve()和访问datavector之外size()应该是安全的,因为根据cplusplus,reserve()"导致容器重新分配其存储,将其容量增加到n",但随后

C)#1话题矛盾的声明b)以上

所以我很困惑并寻找答案.

Nat*_*ica 7

访问data()[n]if 是无效的n >= size().每[vector.data] std::vector::data

返回:指针,这[data(), data() + size())是一个有效的范围.对于非空向量,data() == addressof(front()).

因此,只有data在范围内的值访问才有效[0, size()).


一般来说那么之间的内存data() + size() - 1data + capacity()未初始化.如果您从未初始化的内存中读取未定义的行为.如果你有一个具有非平凡初始化的对象,那么你甚至不能为它赋值,因为实际上在该点中没有对象,只有一个空间.你可能会在未初始化范围内做事,但你违反了合同,std::vector如果你这样做可能会生气;)

  • 在`size()之后`事情变得有趣.库实现可以包括检查越界访问的代码,并使用错误消息暂停程序.它无能为力,让程序消耗未知数据值.它可以扮演La Macarena. (2认同)