c++ - std::vector operator[] 的不正确行为

标签 c++ vector clang std clang++

<分区>

我有下一个代码片段。这个想法是 vector 有 5 个项目,我通过 operator[] 访问 100 个项目,这应该会导致崩溃。但正如您在输出中看到的那样,它是有效的。

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec(5, 1);
    vec[100] = 25;
    std::cout << "vec[100] = " << vec[100] << ", vec[99] = " << vec[99] <<
        ", vector size = " << vec.size() << 
        ", vector capacity = " << vec.capacity() << std::endl;
}

输出:

vec[100] = 25, vec[99] = 0, vector size = 5, vector capacity = 5

编译标志:

clang++ -W -Wall -std=c++14 -stdlib=libc++ vector_over_flow_test.cpp -o vector_overflow_test.bin

clang 版本:

$clang++ --version
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.3.0
Thread model: posix
InstalledDir:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

根据 cpp reference

Returns a reference to the element at specified location pos. No bounds checking is performed.

它是实现中的错误吗?

最佳答案

which is supposed to lead to crash

没有。这只是 undefined behavior .这些实现不需要崩溃;一切皆有可能,包括看起来运作良好。请注意,您永远不应依赖它。

另一方面,std::vector::at执行边界检查,当超出边界时将抛出 std::out_of_range

关于c++ - std::vector operator[] 的不正确行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41777730/

相关文章:

c++ - 我们可以在 main 的参数中添加 CV 限定符吗?

ios - 在 Xcode 4.x 中编译大型源文件(10k+ 行)

c++ - 如何更改 QDoubleSpinBox 的大小?

c++ - OpenSSL Boost context.use_private_key_file 和 context.use_rsa_private_key_file 无一异常(exception)地终止程序

c++ - std::vector<bool> resize() 的未定义行为

c++ - std::for_each 在具有两个参数的成员函数上的用法

c++ - 如何禁用特定的未知 #pragma 警告(GCC 和/或 Clang)

c++ - 堆排序,除了前两个值之外的所有值都被排序

c++ - 为什么以下代码可以正常编译,但在使用 static 时链接显示错误

c++ - 为什么我的输出在到达代码的这一部分时卡住了?