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];