Я использую unordered_map с помощью g++ 4.9.2 на Solaris 10, но неожиданно обнаружил, что clear() не освобождает кучу. Вот пример кода:
#include <iostream>
#include <unordered_map>
int main ()
{
std::unordered_map<long long, long long> mymap;
mymap.rehash(200000);
getchar();
for (int i = 0; i < 2000000; i++) {
mymap[i] = i*i;
}
std::cout << "current bucket_count: " << mymap.bucket_count() << std::endl;
std::cout << "current size: " << mymap.size() << std::endl;
getchar();
mymap.clear();
std::cout << "current bucket_count: " << mymap.bucket_count() << std::endl;
std::cout << "current size: " << mymap.size() << std::endl;
getchar();
return 0;
}
Я наблюдаю размер кучи для программы, когда программа ожидает getchar(). И вот снимок кучи, найденный через pmap -x <PID> | grep heap
1. While waiting on 1st getchar(): `0002C000 792 792 792 - rwx-- [ heap ]`
2. After 1st getchar(): it prints:
current bucket_count: 3439651
current size: 2000000
Heap shows while waiting on 2nd getchar():
0002C000 3920 3920 3920 - rwx-- [ heap ]
00400000 73728 72272 72272 - rwx-- [ heap ]
3. After 2nd getchar(): it prints:
current bucket_count: 3439651
current size: 0
Heap shows while waiting on 2nd getchar():
0002C000 3920 3920 3920 - rwx-- [ heap ]
00400000 73728 72272 72272 - rwx-- [ heap ]
Это показывает (шаг 3), что clear() не влияет на кучу. Хотя в документации сказано,
std::unordered_map::clear
void clear() noexcept;
Clear content
All the elements in the unordered_map container are dropped: their destructors are called, and they are removed from the container, leaving it with a size of 0.
Но мой счетчик кучи не отражает этого. Есть ли другой способ освободить кучу, занятую объектом unordered_map? Или я должен использовать что-то еще? Подскажите, пожалуйста, как освободить память из unordered_map?
new
, библиотека времени выполнения C++ не освободит ее, пока процесс не завершится. - person Martin Bonner supports Monica   schedule 01.03.2017