c++ - 了解 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()
在功能结束之前?
解决方案
我在另一个论坛上问过,那里的人帮助我理解了答案。事实证明,我没有等待足够长的时间来退出createMap
函数,也没有足够的内存来维持这个程序。
创建 INT_MAX=2147483647 个元素,并且map = 24 bytes
对于pair<int, int> = 8 bytes
.
总最小内存 = 2.147483647^9 * 8 + 24 = 17179869200 bytes ~= 17.2 GB
.
我减小了元素的大小,并.clear()
在程序有没有增加的情况下进行了测试,并相应地减小了大小。
推荐阅读
- git - 在 git status 之前不能 git merge --abort
- java - 在 ObjectMapper 中全局配置 JavaTimeModule 而不是使用@datetimeformat
- mysql - MySQL插入数据时如何写锁表
- python - python播放列表解决方案,如何完成is_repeating_playlist函数?
- javascript - 动态表单未发送所有值
- python - 有没有办法通过 Adafruit MQTT python 客户端订阅使用多个提要?
- rust - 有没有办法从另一个向量中存在的通用第一个向量中删除条目?
- jquery - 向 Ajax 请求响应中生成的 Google Map 添加标记
- themes - 设置 XFCE UI 元素的样式,知道它的类和属性
- linux - 如何将多列中的数字排序或重新排列为多行[固定为 4 列]?