首页 > 解决方案 > 了解 C++ 映射为什么不使用 clear() 释放堆内存?

问题描述

假设我有一个永久循环来创建哈希图:

void createMap() {
    map<int, int> mymap;
    for (int i = 0; i < INT_MAX; i++) {
        mymap[i] = i;
    }
    mymap.clear();       // <-- this line doesn't seem to make a difference in memory growth
}

int main (void) {

    while (1) {
        createMap();
    }

    return 0;
}

我观察了代码在 MacOS 上的运行,观察了 Activity Monitor,应用程序在有或没有函数mymap.clear()结束的情况下不断增加内存使用量createMap()

对于使用的情况,内存使用量不应该是恒定的mymap.clear()吗?

使用 STL 数据容器的一般建议是什么?需要.clear()在功能结束之前?

标签: c++stlhashmap

解决方案


我在另一个论坛上问过,那里的人帮助我理解了答案。事实证明,我没有等待足够长的时间来退出createMap函数,也没有足够的内存来维持这个程序。

创建 INT_MAX=2147483647 个元素,并且map = 24 bytes对于pair<int, int> = 8 bytes.

总最小内存 = 2.147483647^9 * 8 + 24 = 17179869200 bytes ~= 17.2 GB.

我减小了元素的大小,并.clear()在程序有没有增加的情况下进行了测试,并相应地减小了大小。


推荐阅读