为什么 std::vector 允许使用 [] 进行分配,但 size() 和 capacity() 没有改变?

wod*_*der 1 c++ stl vector

我进行了如下测试,创建一个向量并将其容量设置为 1,然后用于v[100]=100;直接分配 v[100] 但不触发核心转储,为什么?向量v应该没有足够的内存来访问v[100],但是v[100]成功被赋值为100,并且size和capacity()保持为0和1,如何理解?

int main(){
    std::vector<int> v;
    v.reserve(1); 
    v[100]=100;                      //here does't triggle core dump, wired
    std::cout<<v.size()<<std::endl;  //0 
    std::cout<<v.capacity()<<std::endl; //1
    std::cout<<v[100]<<std::endl;    //100
return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*ace 7

这是因为std::vector::operator[]不做边界检查。如果您使用无效的索引,则会导致未定义的行为。

如果你想要边界检查,那么你应该使用std::vector::at. 如果您使用无效索引,它将引发异常。

v.at(100)=100; // this will throw a std::out_of_range exception
Run Code Online (Sandbox Code Playgroud)