C++ C+中的向量+;:为什么外部尺寸允许EXC#u BAD_访问,而内部尺寸不允许';T

C++ C+中的向量+;:为什么外部尺寸允许EXC#u BAD_访问,而内部尺寸不允许';T,c++,vector,stdvector,C++,Vector,Stdvector,我有以下整数向量的代码(即整数矩阵..) 向量得分(3,向量(2,0)); 不管怎样,越界访问都是未定义的行为 所以任何事情都是允许发生的。只是“碰巧”一个案例崩溃而另一个没有 至于为什么第一种情况不会崩溃,而第二种情况会在特定场景中崩溃,第一种情况主要是将数组读入垃圾堆内存 但是在第二种情况下,您正在访问一个坏的向量对象。由于向量对象只是指针的包装,在第二个索引上取消对该(错误)指针的引用将崩溃。无论哪种方式,访问越界都是未定义的行为 所以任何事情都是允许发生的。只是“碰巧”一个案例崩溃而另

我有以下整数向量的代码(即整数矩阵..)

向量得分(3,向量(2,0));

不管怎样,越界访问都是未定义的行为

所以任何事情都是允许发生的。只是“碰巧”一个案例崩溃而另一个没有


至于为什么第一种情况不会崩溃,而第二种情况会在特定场景中崩溃,第一种情况主要是将数组读入垃圾堆内存


但是在第二种情况下,您正在访问一个坏的
向量
对象。由于
向量
对象只是指针的包装,在第二个索引上取消对该(错误)指针的引用将崩溃。

无论哪种方式,访问越界都是未定义的行为

所以任何事情都是允许发生的。只是“碰巧”一个案例崩溃而另一个没有


至于为什么第一种情况不会崩溃,而第二种情况会在特定场景中崩溃,第一种情况主要是将数组读入垃圾堆内存


但是在第二种情况下,您正在访问一个坏的
向量
对象。由于
向量
对象只是指针的包装器,因此在第二个索引上取消对该(错误)指针的引用将崩溃。

如果违反规则,则无法保证会发生什么。有时是一回事,有时又是另一回事。这就是为什么遵守规则很重要。它们让你的行为可以预测


如果你保持在限速之下,你就永远不会因为超速而被拦下。如果你超限,有时你会被拦下,有时你不会。如果你违反规则,你无法保证会发生什么。有时是一回事,有时又是另一回事。这就是为什么遵守规则很重要。它们让你的行为可以预测


如果你保持在限速之下,你就永远不会因为超速而被拦下。如果你超过了限制,有时你会被拦下,有时你不会。

理论上两者都不应该起作用,但是,
操作符[]
不需要检查边界访问(而
at()
是)。因此,调用
分数[1][5]
会进入未定义的行为区域,不幸的是,在这种情况下,这不会导致崩溃。这只是“C/C++中未定义的行为可以做任何事情”原则的另一个应用程序。

理论上两者都不应该起作用,但是,
操作符[]
不需要检查边界访问(而
at()
是)。因此,调用
分数[1][5]
会进入未定义的行为区域,不幸的是,在这种情况下,这不会导致崩溃。这只是“C/C++中未定义的行为可以做任何事情”原则的另一个应用。

你很幸运:
[5][1]
超出了为向量分配的区域,但
[1][5]
没有。你很幸运:
[5][1]
超出了为向量分配的区域,但
[1][5]
没有。
vector<vector<int> > scores (3, vector<int>(2,0));
cout<<scores[1][5];
cout<<scores[5][1];