C++ STL 库 vector 二维数组不越界

标签 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;
}

最佳答案

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

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

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

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

关于C++ STL 库 vector 二维数组不越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30148539/

相关文章:

java - 在 GridLayout 中交换组件时出现 IndexOutOfBoundException 和 NullPointerException?

c++ - boost 范围算法实现和复杂性保证

c++ - 所有 end() 迭代器都等同于集合类型吗?

java - 如何消除索引越界异常的错误

c++ - GCC libstdc++ 配置文件模式的替代方案

用于深度嵌套私有(private)数据的 C++/STL 公共(public)迭代器

java - 从 JTable 中删除行 - Java

c++ - 为什么我不能分配这个 Qt 属性?

c++ - 如果在某些输入之后使用 getline() 将不起作用

c++ - 当不需要检查缩小时,是否需要实例化函数定义?