Удаление элементов из map внутри цикла
Сервис чистит карту сессий с нулевым счётчиком:
for (auto it = sessions.begin(); it != sessions.end(); ++it) {
if (it->second.refs == 0) {
sessions.erase(it);
}
}
Периодически процесс падает или зацикливается. Что здесь неверно?
- Нельзя менять `std::map` во время обхода вообще: сначала соберите ключи, потом удаляйте — других вариантов нет
- Ошибка в условии выхода: `end()` пересчитывается на каждой итерации, из-за чего цикл не завершается
- `erase` по итератору удаляет весь поддиапазон до конца контейнера, поэтому теряются лишние элементы
- После `erase(it)` итератор `it` недействителен, и следующий `++it` — неопределённое поведение
