C ++ STL Library Vector 2D数组不受界限限制

时间:2015-05-10 06:51:14

标签: c++ stl indexoutofboundsexception

当我尝试运行下面的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;
}

1 个答案:

答案 0 :(得分:1)

C ++不会对operator[]的{​​{1}}进行越界检查,因此访问out-of-bounds元素是未定义的行为。它可能没有任何问题,或者可能导致程序崩溃甚至格式化硬盘。

事实上,对于小的未命中(如几个元素等),访问可能属于程序拥有的内存,因此程序很可能不会注意到它。 (如果你没有覆盖其他重要的变量。)特别是,vector通常会保留比实际使用的内存更多的内存,因此vector的小错误最有可能属于分配 - 但不是 - 使用内存并运行正常。

在这种特殊情况下,正确的运行非常奇怪,因为它离边界很远,但我认为优化器可能会优化数组访问。它可以看到分配和打印相同的元素,并可以删除对齐和打印。

要进行正确的绑定检查,您可以使用.at()