我进行了如下测试,创建一个向量并将其容量设置为 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)
这是因为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)
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |