23

I have a std::vector. I check its size which is 6 but when I try to access vec[6] to check whether it will give error, I get no error but some number instead. Should not it give an error?

edit: something like:

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

4 回答 4

50

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

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

于 2013-05-18T02:56:40.217 回答
10

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

我对相关文档进行了概述:

gnu libstdc++

铿锵的libcxx

促进

微软

请注意,gnu 和 clang 默认禁用检查,而 microsoft 默认启用它们。如果您没有意识到这一点,您的代码在 Microsoft 系统上的调试模式下运行速度可能会明显变慢。

于 2018-02-15T09:41:35.613 回答
4

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

于 2013-05-18T02:55:56.160 回答
-2

数据结构的索引从 0 开始,因此如果您正在访问 vec[6],那么这将超出范围。由于内存问题,您可能不会收到错误;您之前运行的代码可能存在某些问题,或者一些类似的错误。请张贴代码。

于 2013-05-18T02:56:26.617 回答