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

时间:2017-01-21 09:30:32

标签: 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

  

返回对指定位置pos处元素的引用。没有进行边界检查。

这是实施中的错误吗?

2 个答案:

答案 0 :(得分:8)

  

应该导致崩溃

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

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

答案 1 :(得分:3)

根据您引用的文档,这不是错误:

  

返回对指定位置pos处元素的引用。没有进行边界检查。

幸运的是它没有崩溃并且工作正常。