我有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
}
答案 0 :(得分:36)
STL向量在调用.at()
成员函数时执行边界检查,但是do not perform any checks on the []
operator。
当超出范围时,[]
运算符会产生未定义的结果。
答案 1 :(得分:8)
正如克格雷尼的回答所述,这是未定义的行为。但是,大多数c ++库都有一些中止功能,或者在这种情况下引发异常。通常通过设置或取消设置特定的编译器宏来控制。
我概述了相关文档:
_SCL_SECURE_NO_WARNINGS - 不太安全(根据微软的说法),但更符合标准:
_SECURE_SCL - 设置迭代器调试级别的旧方法
请注意,默认情况下,gnu和clang会禁用检查,而默认情况下,Microsoft会启用它们。如果您没有意识到这一点,那么在Microsoft系统的调试模式下,您的代码可能会运行得非常慢。
答案 2 :(得分:3)
这是未定义的行为。未定义的行为并不一定意味着您会收到错误:您可能,但您可能会得到一些没有多大意义的结果。
答案 3 :(得分:-1)
数据结构从0开始编制索引,因此如果您正在访问vec [6],那么这将超出范围。由于内存问题,您可能不会收到错误;你可能已经运行过以前的代码,或者有类似的错误。请发布代码。