【问题标题】:C++ STL Library Vector 2D arrays not out of bounds [duplicate]C ++ STL库向量二维数组未超出范围[重复]
【发布时间】:2015-07-20 19:52:37
【问题描述】:

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

【问题讨论】:

  • 尝试与at() 相同。索引运算符不做绑定检查 IIRC。

标签: c++ stl indexoutofboundsexception


【解决方案1】:

C++ 不对operator[] 进行vectors 的越界检查,因此访问越界元素是未定义的行为。它可以很好地运行而没有任何问题,或者可能会使您的程序崩溃甚至格式化您的硬盘。

事实上,对于小的缺失(比如几个元素等),访问可能会落入您的程序拥有的内存中,因此程序很可能会在没有注意到它的情况下运行。 (前提是您没有覆盖其他重要变量。)特别是,vectors 通常会保留比实际使用更多的内存,因此vector 的小失误很可能会落入已分配但未使用的内存中,并且会运行正常。

在这种特殊情况下,正确的运行是非常奇怪的,因为它离界限真的很远,但我认为优化器可以完全优化数组访问。可以看到同一个元素被赋值和打印,并且可以去掉赋值和打印。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多