问题描述
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
是一个)。