Вектор выходит за пределы без ошибки

У меня есть 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
}

person Shibli    schedule 18.05.2013    source источник
comment
размер 6, поэтому последний vec[5] начинается с 0   -  person Bill    schedule 18.05.2013
comment
Не знаю, откуда вы взяли, что vector вызовет ошибку в недопустимом индексе, используя operator[]. Документы определенно говорят об обратном.   -  person Ed S.    schedule 18.05.2013
comment
comment
@Bill: я думаю, они понимают, что индексы начинаются с нуля и что 6 выходит за пределы диапазона, но им интересно, почему доступ к чему-то вне диапазона не приводит к ошибке.   -  person icktoofay    schedule 18.05.2013
comment
@ЭдС. есть ли причины, по которым для op [] не реализована проверка границ?   -  person Koushik Shetty    schedule 18.05.2013
comment
@icktoofay: все, что нужно сделать, это прочитать документы, чтобы увидеть, что это приводит к UB   -  person Ed S.    schedule 18.05.2013
comment
@Koushik: Потому что это замедляет работу. Вот для чего нужен at()   -  person Ed S.    schedule 18.05.2013
comment
If the container size is greater than n, the function never throws exceptions (no-throw guarantee). Otherwise, the behavior is undefined. -- та же ссылка, что и в моем предыдущем комментарии.   -  person Bill    schedule 18.05.2013
comment
@EdS.: Я знаю, и это то, что говорится в моем ответе. Мне не интересно, человек, который задал вопрос!   -  person icktoofay    schedule 18.05.2013
comment
11 голосов за то, что просто не ознакомились с документацией. Почему?   -  person Lightness Races in Orbit    schedule 16.02.2018


Ответы (4)


Векторы STL выполняют проверку границ при вызове функции-члена .at(), но не выполняют никаких проверок на [] оператор.

При выходе за пределы оператор [] дает неопределенные результаты.

person kgraney    schedule 18.05.2013
comment
Поведение не определено, поэтому реализациям разрешено вводить проверки границ; отличие от at заключается в том, что проверки границ требуются для at. - person Pete Becker; 18.05.2013

Как указано в ответе kgraney, это поведение undefined. Однако в большинстве библиотек C++ есть средства для прерывания или создания исключения в таких случаях. Обычно управляется установкой или снятием определенных макросов компилятора.

Я сделал обзор соответствующей документации:

gnulibstdС++

лязг libcxx

способствовать росту

  • BOOST_DISABLE_ASSERTS — отключить утверждения в повысить библиотеку.

Майкрософт

Обратите внимание, что gnu и clang отключают проверки по умолчанию, в то время как Microsoft по умолчанию включает их. Если вы не знаете об этом, ваш код может работать значительно медленнее в режиме отладки в системе Microsoft.

person Willem Hengeveld    schedule 15.02.2018
comment
...может работать значительно медленнее в режиме отладки в системе Microsoft. - person legalize; 16.02.2018

Это неопределенное поведение. Неопределенное поведение не обязательно означает, что вы получите ошибку: вы можете, но вместо этого вы можете получить какой-то результат, который не имеет особого смысла.

person icktoofay    schedule 18.05.2013

Структуры данных индексируются, начиная с 0, поэтому, если вы обращаетесь к vec[6], это будет за пределами допустимого. Скорее всего, вы не получите сообщение об ошибке из-за проблемы с памятью; там может быть что-то из предыдущего кода, который вы запускали, или какая-то подобная ошибка. Пожалуйста, напишите код.

person john smith    schedule 18.05.2013