Vector saliendo de los límites sin dar error

Resuelto Shibli asked hace 11 años • 4 respuestas

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
}
Shibli avatar May 18 '13 09:05 Shibli
Aceptado

std::vectorrealiza 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.

kgraney avatar May 18 '2013 02:05 kgraney

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.

Willem Hengeveld avatar Feb 15 '2018 09:02 Willem Hengeveld