Я проверил его и, похоже, влияет на несколько версий компилятора (включая VS, Clang, GCC).
Код для воспроизведения проблемы:
Код: Выделить всё
std::unordered_map m;
for (int i = 0; i < 5000000; i++)
m.insert(std::make_pair(i, new data_type));
for (map_type::iterator it = m.begin(); it != m.end();) {
delete it->second;
it = m.erase(it);
}
Насколько я понимаю, причина этого в том, что можно стирать элементы посредством итерации и сохранять допустимые итераторы вместо нестертых элементов. Это кажется немного странным требованием, поскольку вставка элементов может вызвать повторное хеширование, которое в любом случае сделает итераторы недействительными.
Но вы можете уничтожить карту напрямую..
Именно так я это исправил (я обернул карту в интеллектуальный указатель, и когда она пуста, я просто воссоздаю новую пустую карту, в результате это происходит быстрее, чем перехеширование, не знаю почему.).
В общем, любое приложение, использующее unordered_map в качестве контейнера для кэширования элементов, может пострадать от этой проблемы (вы можете захотеть удалить элементы из кеша, но обычно никто не выполняет "кэширование" сброс")
Мобильная версия