Вступить в клуб →
сложнаявопросПамять и RAII

string_view, возвращённый из функции

Разработчик оптимизировал разбор заголовков, чтобы не копировать строки:

std::string_view session_id(const Request& r) {
    std::string id = r.header("X-Session");   // header возвращает std::string по значению
    return id;
}

auto sv = session_id(req);
store(sv);

В тестах всё зелёное, но под нагрузкой в базу попадают обрывки чужих строк. Что произошло?

  • `std::string_view` не хранит завершающий нуль, поэтому `store` читает за границей строки
  • `string_view` возвращает вид на локальную строку, которая уничтожена при выходе из функции: `sv` указывает на освобождённую память
  • Проблема в кодировке: `string_view` работает с `char`, а заголовки приходят в UTF-8, символы режутся по границе байта
  • Виноват оптимизатор: в Release включается copy elision, из-за которой возвращаемое значение не копируется

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела