C++ 访问 vector 超出 size() 和低于 capacity()

标签 c++ vector

访问 vector 的 data()[i] 对于超出 vector 的 size() 和 vector 的 的索引 i 是否安全容量()?

这是我的推理:

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

b) 使用 reserve() 并访问超出 vector 的 size()data 应该是安全的,因为根据 cplusplus , reserve() “导致容器重新分配其存储空间,将其容量增加到 n”,但是随后

c) Stackoverflow topic与上面的语句 b)

相矛盾

所以我很困惑,正在寻找答案。

最佳答案

如果 n >= size(),则访问 data()[n] 无效。每[vector.data] std::vector::data

Returns: A pointer such that [data(), data() + size()) is a valid range. For a non-empty vector, data() == addressof(front()).

所以只有在[0, size())范围内访问data才有效。


通常 data() + size() - 1data + capacity() 之间的内存未初始化。如果您从未定义行为的未初始化内存中读取。如果您有一个具有非平凡初始化的对象,那么您甚至无法为其分配一个值,因为该位置实际上没有对象,只有一个空间。你可能会在未初始化的范围内做事,但你违反了与 std::vector 的契约(Contract),如果你这样做可能会生气;)

关于C++ 访问 vector 超出 size() 和低于 capacity(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53749409/

相关文章:

c++ - 使用 Rcpp 时如何并行化 C++ 代码?

c++ - MinGW 链接路径

c++ - 将值设置为 static const unsigned int

c++ - 如何在 Linux 上延迟加载共享库

c++ - 将类 vector 的元素设置为等于类时的行为

c++ - std::vector 是否调用对象指针的析构函数?

删除字符串中第一个 'backslash' 之后的所有内容

c++ - 将多个 void* 复制到一个 vector 中

C++ 用更多元素重写浮点 vector

c++ - struct 专用原子类型如何实现无锁?