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

时间:2013-05-18 02:52:59

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

4 个答案:

答案 0 :(得分:36)

STL向量在调用.at()成员函数时执行边界检查,但是do not perform any checks on the [] operator

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

答案 1 :(得分:8)

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

我概述了相关文档:

gnu libstdc ++

clang libcxx

升压

微软

请注意,默认情况下,gnu和clang会禁用检查,而默认情况下,Microsoft会启用它们。如果您没有意识到这一点,那么在Microsoft系统的调试模式下,您的代码可能会运行得非常慢。

答案 2 :(得分:3)

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

答案 3 :(得分:-1)

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