C++ 向量越界而不给出错误

C++ 向量越界而不给出错误,c++,stdvector,C++,Stdvector,我有一个std::vector。我检查它的大小是6,但当我尝试访问vec[6]以检查它是否会出错时,我得到的不是错误,而是一些数字。它不应该给出一个错误吗 编辑:类似于: struct Element { std::vector<double> face; }; int main() { Element elm; .... // insert 6 elements into elm.face std::cout << elm.face

我有一个
std::vector
。我检查它的大小是6,但当我尝试访问
vec[6]
以检查它是否会出错时,我得到的不是错误,而是一些数字。它不应该给出一个错误吗

编辑:类似于:

struct Element
{
    std::vector<double> face;
};

int main()
{
    Element elm;

    .... // insert 6 elements into elm.face

    std::cout << elm.face.size() << std::endl; // answer is 6
    std::cout << elm.face[6] << std::endl; // answer is some number
}
struct元素
{
向量面;
};
int main()
{
元素榆树;
..//在elm.face中插入6个元素

std::cout这是未定义的行为。未定义的行为不一定意味着您会出错:您可能会出错,但您可能会得到一些没有多大意义的结果。

数据结构从0开始索引,因此如果您正在访问vec[6]那么这将是超出范围的。您可能不会因为内存问题而收到错误;可能是您以前运行的代码中有错误,或者是类似的错误。请发布代码。

STL向量在调用
.at()
成员函数时执行边界检查,但是


当超出界限时,<代码> []/Cord>运算符产生未定义的结果。如在KGrayy的回答中所述的

< P>,这是未定义的行为。然而,大多数C++库都有一定的中止或在这种情况下引发异常的能力。通常通过设置或取消设置特定编译器宏的

来控制。 我已对相关文件进行了概述:

gnu libstdc++
  • --有关libstdc++调试的一般信息
  • ,-ff-使C++概念
叮当声
促进
  • --禁用boost库中的断言
微软
  • --设置迭代器调试级别
  • _CRT\u安全\u无警告:禁用弃用警告
  • --不太安全(根据microsoft的说法),但更符合标准:

  • --设置迭代器调试级别的旧方法

  • -不推荐使用的宏

请注意,gnu和clang在默认情况下禁用检查,而microsoft在默认情况下启用了检查。如果您不知道这一点,则在microsoft系统上,您的代码在调试模式下的运行速度可能会显著降低。

size 6,所以最后一个是
vec[5]
从0开始,不确定你是从哪里想到的
向量
会使用
操作符[]
在无效索引上抛出错误。文档肯定会这样说。
注意第一个元素的位置是0(不是1)。
-@Koushik:因为它会减慢速度。这就是
at()
仅因未能查阅文档而获得11票赞成票。为什么?行为未定义,因此允许实现引入边界检查;与
at
的区别在于,
at
需要边界检查……在microsoft系统的调试模式下可能会运行得非常慢。