Неопределенное поведение означает, что поведение вашей программы не определено стандартом C ++.Соответствующий компилятор C ++ может делать что угодно с программой, которая имеет, или будет , демонстрировать неопределенное поведение (да, UB может путешествовать во времени).
Ваша программа показывает неопределенноеповедение путем доступа к v_
как к объекту до его создания в B::B
.Учитывая, что он делает это, ничего в отношении выполнения ваших программ не указано и не ограничено стандартом C ++.
В этом случае компилятор обрабатывает доступ к UB так, как если бы он обращался к пустому std::vector
.Это допустимо, потому что что-либо действительно .Затем программа работает, как если бы вы не сделали UB (кроме вышеуказанного признака), что также является допустимым вариантом.
Если мы представляем удаление UB в ctor, во время уничтожения вашей программы сноваэкспонаты UB.На этот раз доступ к v_
как к объекту vector
после его уничтожения.Опять же, при этом поведение вашей программы не определяется или не ограничивается стандартом C ++ до, в и после UB.
В этом случае она ведет себя так, как если бы у вас был вектор с двумя значениямизначения которого равны 0. Это соответствует, потому что что-либо соответствует .
Одна из многих возможностей состоит в том, что данные были переработаны в куче, но указатели оставлены висящими.Обрабатывая «сгнившие» данные вектора как указатели, они по-прежнему указывают 2 sizeof(int)
друг от друга, а .size()
читает это как 2. Однако данные, на которые указывают, были переработаны в куче, и там есть другие данные.