矢量走出界限而不给出错误

Shi*_*bli 15 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.size() << std::endl; // answer is 6
    std::cout << elm.face[6] << std::endl; // answer is some number
}
Run Code Online (Sandbox Code Playgroud)

kgr*_*ney 38

STL向量在.at()调用成员函数时执行边界检查,但不对[]运算符执行任何检查.

当超出范围时,[]运算符会产生未定义的结果.

  • 行为是未定义的,因此允许实现**以引入边界检查; 与`at`的区别在于,'at`需要**的边界检查. (7认同)

Wil*_*eld 8

如kgraney的回答所述,这是未定义的行为.但是,大多数c ++库都有一些中止功能,或者在这种情况下引发异常.通常通过设置或取消设置特定的编译器宏来控制.

我概述了相关文档:

gnu libstdc ++

clang libcxx

促进

微软

请注意,gnu和clang默认禁用检查,而microsoft默认启用它们.如果您不知道这一点,那么在Microsoft系统上的调试模式下,您的代码可能会运行得非常慢.