当我尝试运行下面的C ++代码时,它不会返回超出范围的错误。事实上,它运行正常,并给我11输出。这是为什么?
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector< vector<int> > Matrix(10, vector<int>(10));
Matrix[9][10000]=11;
cout<<Matrix[9][10000];
return 0;
}
答案 0 :(得分:1)
C ++不会对operator[]
的{{1}}进行越界检查,因此访问out-of-bounds元素是未定义的行为。它可能没有任何问题,或者可能导致程序崩溃甚至格式化硬盘。
事实上,对于小的未命中(如几个元素等),访问可能属于程序拥有的内存,因此程序很可能不会注意到它。 (如果你没有覆盖其他重要的变量。)特别是,vector
通常会保留比实际使用的内存更多的内存,因此vector
的小错误最有可能属于分配 - 但不是 - 使用内存并运行正常。
在这种特殊情况下,正确的运行非常奇怪,因为它离边界很远,但我认为优化器可能会优化数组访问。它可以看到分配和打印相同的元素,并可以删除对齐和打印。
要进行正确的绑定检查,您可以使用.at()
。