Ответ 1
STL-векторы выполняют проверку границ при вызове функции-члена .at()
, но не выполняют никаких проверок оператора []
.
Если за пределами, оператор []
создает undefined результаты.
У меня есть 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
}
STL-векторы выполняют проверку границ при вызове функции-члена .at()
, но не выполняют никаких проверок оператора []
.
Если за пределами, оператор []
создает undefined результаты.
Как указано в ответе kgraney, это поведение undefined. Тем не менее, большинство библиотек С++ имеют некоторые возможности для отмены или создания исключения в таких случаях. Обычно контролируется установкой или отключением определенных макросов компилятора.
Я сделал обзор соответствующей документации:
_ SCL_SECURE_NO_WARNINGS - менее безопасно (согласно Microsoft), но более стандартно соответствует:
_ SECURE_SCL - старый метод установки уровня отладки итератора
Обратите внимание, что gnu и clang отключают проверки по умолчанию, а microsoft - по умолчанию. Если вы не знаете об этом, ваш код может работать значительно медленнее в режиме отладки в системе Microsoft.
Это поведение undefined. Поведение undefined не обязательно означает, что вы получите ошибку: вы можете, но вместо этого вы можете получить некоторый результат, который не имеет большого смысла.
Структуры данных индексируются начиная с 0, поэтому, если вы обращаетесь к vec [6], то это будет за пределами границ. Вероятно, вы не получите ошибку из-за проблемы с памятью; там может быть что-то из предыдущего кода, который вы выполнили, или какой-либо подобной ошибки. Пожалуйста, отправьте код.