Указатель на элемент растущего вектора
В пуле соединений сессии хранятся в векторе, а обработчики держат указатели на них:
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`: объект конструируется на месте, поэтому перемещений элементов не будет
