Почему C++11/Boost `unordered_map` не перехешируется при стирании?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему C++11/Boost `unordered_map` не перехешируется при стирании?

Сообщение Anonymous »

Мне интересно, почему хеш-карта C++11 и Boost не изменяет размер при стирании элементов посредством итерации. Даже если технически это не является утечкой памяти, я думаю, что это может быть серьезной проблемой в приложениях (для меня это была скрытая проблема, мне было трудно ее отследить), и на самом деле это могло повлиять на многие приложения. Является ли это «недостатком дизайна» контейнера?
Я проверил его и, похоже, влияет на несколько версий компилятора (включая 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 в качестве контейнера для кэширования элементов, может пострадать от этой проблемы (вы можете захотеть удалить элементы из кеша, но обычно никто не выполняет "кэширование" сброс")
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»