Вступить в клуб →
сложнаявопросSTL и контейнеры

Указатель на элемент растущего вектора

В пуле соединений сессии хранятся в векторе, а обработчики держат указатели на них:

std::vector<Session> sessions;

Session* create() {
    sessions.push_back(Session{});
    return &sessions.back();
}

Session* a = create();
Session* b = create();
a->touch();

Под нагрузкой сервис читает мусор и изредка падает. Какое решение устраняет причину, а не симптом?

  • Хранить `std::vector<std::unique_ptr<Session>>` либо узловой контейнер (`std::deque`, `std::list`) — адреса объектов перестанут зависеть от роста
  • Вызвать `sessions.reserve(1024)` при старте: пока размер не превысит ёмкость, указатели остаются валидными, а тысячи соединений сервису хватит с запасом
  • Возвращать `const Session*` — константный указатель не инвалидируется при реаллокации
  • Заменить `push_back` на `emplace_back`: объект конструируется на месте, поэтому перемещений элементов не будет

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

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

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

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