【发布时间】:2017-07-20 16:01:25
【问题描述】:
我在 Solaris 10 上使用 g++ 4.9.2 使用 unordered_map,但令人惊讶的是,我发现 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 释放内存?
【问题讨论】:
-
您从“文档”中得到的引用并没有说明释放地图内部使用的内存,只是地图将变为空。它显然是(因为您将大小打印为零)。
-
我认为您必须了解大小和容量之间存在差异,它不会释放底层数据结构,即使它确实释放了用于包含元素的内存。当您调用 clear 时,它可能会调用析构函数并将某个大小变量设置为 0,但不会释放容器持有的内存。
-
从操作系统获取内存以返回以响应
new调用,C++ 运行时库在进程结束之前不会释放它。
标签: c++ memory-leaks heap-memory unordered-map dynamic-allocation