Сообщение Re: Никто так и не объяснил по делу. от 09.10.2017 23:16
Изменено 09.10.2017 23:19 pkl
Re: Никто так и не объяснил по делу.
Здравствуйте, Caracrist, Вы писали:
C>
C>is subj. UB?
1. Если вектор пуст, то UB, т.к. вызов v[0] в случае пустоты имеет право убица апстену.
2. Если вектор не пуст, то сначала возьмём константную ссылку на v[0], потом вызовем emplace_back(), что может привести к переезду памяти с освобождением старого куска, куда показывает взятый указатель на v[0] (ссылка) и тогда при последующем старте конструирования нового emplaced-объекта получим тоже UB по причине чтения из ссылки (указателя) уже ведущей вникуда.
Короче, да, это UB.
Всякие там советы "не делай так" — тупые, ибо не содержат аргументов.
C>
C>std::vector<T> v;
C>C>is subj. UB?
1. Если вектор пуст, то UB, т.к. вызов v[0] в случае пустоты имеет право убица апстену.
2. Если вектор не пуст, то сначала возьмём константную ссылку на v[0], потом вызовем emplace_back(), что может привести к переезду памяти с освобождением старого куска, куда показывает взятый указатель на v[0] (ссылка) и тогда при последующем старте конструирования нового emplaced-объекта получим тоже UB по причине чтения из ссылки (указателя) уже ведущей вникуда.
Короче, да, это UB.
Всякие там советы "не делай так" — тупые, ибо не содержат аргументов.
Re: Никто так и не объяснил по делу.
Здравствуйте, Caracrist, Вы писали:
C>
C>is subj. UB?
1. Если вектор пуст, то UB, т.к. вызов v[0] в случае пустоты имеет право убица апстену.
2. Если вектор не пуст, то сначала возьмём константную ссылку на v[0] (адрес памяти), потом вызовем emplace_back(), что может привести к переезду памяти с освобождением старого куска, куда показывает взятый указатель на v[0] (ссылка) и тогда при последующем старте конструирования нового emplaced-объекта получим тоже UB по причине чтения из ссылки (указателя) уже ведущей вникуда.
Короче, да, это UB.
Всякие там советы "не делай так" — тупые, ибо не содержат аргументов.
C>
C>std::vector<T> v;
C>C>is subj. UB?
1. Если вектор пуст, то UB, т.к. вызов v[0] в случае пустоты имеет право убица апстену.
2. Если вектор не пуст, то сначала возьмём константную ссылку на v[0] (адрес памяти), потом вызовем emplace_back(), что может привести к переезду памяти с освобождением старого куска, куда показывает взятый указатель на v[0] (ссылка) и тогда при последующем старте конструирования нового emplaced-объекта получим тоже UB по причине чтения из ссылки (указателя) уже ведущей вникуда.
Короче, да, это UB.
Всякие там советы "не делай так" — тупые, ибо не содержат аргументов.