Выражение char* ptr = &sub[0];
дает вам указатель на char
.Однако при выполнении sub += s[i];
может потребоваться увеличение внутреннего хранилища string
для размещения нового персонажа.Если вы продолжите добавлять к нему, в конечном итоге это произойдет.Это сделает недействительным ptr
и сделает его непригодным для использования до тех пор, пока он не будет переназначен.
Когда такое перераспределение действительно происходит, выделяется больший буфер, предыдущее значение перемещается из более короткого буфера в больший буфер, затем более короткий буферуничтожен, чтобы быть заменен большим.Но ptr
все еще указывает на то место, где были данные предыдущего более короткого буфера.Теперь он указывает на элемент разрушенного объекта.Когда вы делаете string temp = ptr;
, вы рискуете инициализировать string
из недействительного указателя, который является неопределенным поведением.
Одним из относительно простых решений будет придерживаться индексов вместо указателей.Индексы по своей природе не становятся недействительными, если они находятся в пределах размера string
.Другое возможное решение может заключаться в использовании reserve
для предварительного выделения достаточно большой емкости, которую ему никогда не придется перераспределять.