Vector going out of bounds without giving error

STL vectors perform bounds checking when the .at() member function is called, but do not perform any checks on the [] operator.

When out of bounds, the [] operator produces undefined results.


As stated in kgraney's answer, this is undefined behaviour. However, most c++ libraries have some facility to abort, or raise an exception in such cases. Usually controlled by setting or unsetting specific compiler macro's.

I have made an overview of the relevant documentation:

gnu libstdc++

  • Debug mode -- general info about libstdc++ debugging
  • _GLIBCXX_DEBUG
  • _GLIBCXX_CONCEPT_CHECKS, with -fconcepts -- enable c++ concepts

clang libcxx

  • _LIBCPP_DEBUG_LEVEL=1

boost

  • BOOST_DISABLE_ASSERTS -- disable asserts in the boost library.

Microsoft

  • Checked Iterators
  • _ITERATOR_DEBUG_LEVEL -- set iterator debug level
  • Security Features in the CRT
  • _CRT_SECURE_NO_WARNINGS : disable deprecation warnings
  • _SCL_SECURE_NO_WARNINGS -- less safe(according to microsoft), but more standard compliant:

  • _SECURE_SCL -- old method of setting iterator debug level

  • _HAS_ITERATOR_DEBUGGING - deprecated macro

Note that gnu and clang disable the checks by default, while microsoft has them enabled by default. If you are unaware of this, your code may run significantly slower in debug mode on a microsoft system.


It's undefined behavior. Undefined behavior does not necessarily mean you'll get an error: you might, but you might instead get some result that doesn't make much sense.