Vector saliendo de los límites sin dar error
Tengo un std::vector
. Compruebo su tamaño que es 6 pero cuando intento accedervec[6]
para comprobar si da error, no aparece ningún error, sino un número. ¿No debería dar error?
editar: algo como:
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
}
std::vector
realiza comprobaciones de límites cuando at()
se utiliza la función miembro, pero no realiza ninguna comprobación conoperator[]
.
Cuando está fuera de límites operator[]
produce resultados indefinidos.
Como se indica en la respuesta de kgraney, este es un comportamiento indefinido. Sin embargo, la mayoría de las bibliotecas de C++ tienen alguna posibilidad de cancelar o generar una excepción en tales casos. Generalmente se controla configurando o desarmando macros del compilador específicas.
He hecho una descripción general de la documentación relevante:
gnulibstdc++
- Modo de depuración : información general sobre la depuración de libstdc++
- _GLIBCXX_DEBUG
- _GLIBCXX_CONCEPT_CHECKS , con -fconcepts: habilita conceptos de C++
sonido metálico libcxx
- _LIBCPP_DEBUG_LEVEL=1
aumentar
- BOOST_DISABLE_ASSERTS : deshabilita las afirmaciones en la biblioteca de impulso.
microsoft
- Iteradores comprobados
- _ITERATOR_DEBUG_LEVEL : establece el nivel de depuración del iterador
- Funciones de seguridad en el CRT
- _CRT_SECURE_NO_WARNINGS: deshabilitar las advertencias de obsolescencia
_SCL_SECURE_NO_WARNINGS : menos seguro (según Microsoft), pero más compatible con los estándares:
_SECURE_SCL : método antiguo para configurar el nivel de depuración del iterador
- _HAS_ITERATOR_DEBUGGING - macro obsoleta
Tenga en cuenta que gnu y clang desactivan las comprobaciones de forma predeterminada, mientras que microsoft las tiene habilitadas de forma predeterminada. Si no lo sabe, su código puede ejecutarse significativamente más lento en el modo de depuración en un sistema Microsoft.