C ++: почему ввод строки не выполняется, а другой нет

Peter Steinberger просто написал твиттер о частном уведомлении UIWindowFirstResponderDidChangeNotification, который вы можете наблюдать, если хотите посмотреть изменение первого ретранслятора.

0
задан Wolfy 21 February 2019 в 03:45
поделиться

2 ответа

std::string::c_str() :

Возвращенный указатель может быть признан недействительным при последующих вызовах других функций-членов, которые модифицируют объект.


std::vector::emplace_back :

Если происходит перераспределение, все содержащиеся в нем элементы модифицируются.


Поскольку нет способа узнать, произойдет ли перераспределение vector при вызове emplace_back, вы должны предположить, что последующее использование более раннего возвращаемого значения из string::c_str() приводит к неопределенное поведение.

Так как неопределенное поведение - неопределенное - может произойти все что угодно. Следовательно, может показаться, что ваш код работает или не работает. В любом случае, это ошибка.

0
ответ дан Sid S 21 February 2019 в 03:45
поделиться

Это неопределенное поведение (UB), означающее, что может произойти все что угодно, включая работающий код. Это UB, потому что emplace_back делает недействительными все указатели на объекты в векторе. Это происходит потому, что вектор может быть перераспределен (что, очевидно, так и есть).

Первый случай UB «не работает» из-за оптимизации короткой строки (sso). Из-за sso необработанный указатель указывает на память, непосредственно выделенную вектором, которая теряется после перераспределения.

Второй случай UB «работает», потому что текст строки слишком длинный для SSO и находится в независимом блоке памяти. Во время изменения размера строковый объект перемещается из, перемещая владельца блока памяти текста во вновь созданный строковый объект. Поскольку блок памяти просто меняет владельца, он остается в силе после emplace_back.

0
ответ дан Michael Veksler 21 February 2019 в 03:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: