当我尝试运行下面的 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;
}
C++ 不会对 vector
的 operator[]
进行越界检查,因此访问越界元素是未定义的行为。它可能运行良好,没有任何问题,也可能使您的程序崩溃甚至格式化您的硬盘。
事实上,对于小的遗漏(如几个元素等),访问可能落入您的程序拥有的内存中,因此程序很可能会在运行时没有注意到它。 (前提是您没有覆盖其他重要变量。)特别是,vector
通常会保留比实际使用更多的内存,因此 vector
的小失误很可能会落入已分配但未使用的内存,运行正常。
在这种特殊情况下,正确运行是非常奇怪的,因为它确实远离界限,但我认为优化器可能会优化数组访问。可以看到同一个元素被赋值打印,也可以去掉赋值打印。
要进行正确的绑定(bind)检查,您可以使用 .at()
.