了解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上的运行情况,并观察了活动监视器,应用程序在mymap.clear()函数结尾处添加或不添加createMap()时,内存使用量一直在增长。

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

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

解决方法

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

需要创建INT_MAX = 2147483647元素,并且需要为map = 24 bytes的每个pair<int,int> = 8 bytes元素创建。

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

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

,

您创建的容器绑定到您的功能范围。如果该函数返回,则其生存期结束。并且std::map拥有其数据,因此它分配的内存在销毁后将被释放。

因此,您的代码会不断分配和释放相同数量的内存。因此,尽管确切的存储位置可能会有所不同,但是内存消耗是恒定的。这也意味着您不应在此函数结束时手动调用clear。如果您想清空以后要继续使用的容器,请使用clear

请注意,std::map不是哈希图(std::unordered_map是一个)。