c++ - 理解 C++ 映射为什么不使用 clear() 释放堆内存?

标签 c++ stl hashmap

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

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() 的情况下进行了测试。该计划相应地扩大和缩小。

关于c++ - 理解 C++ 映射为什么不使用 clear() 释放堆内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63408667/

相关文章:

c++ sort 会崩溃,而 stable_sort 不会,但两者都不起作用

c++ - 包含 <fstream> 的代码无法编译

c++ - 防止 xml 炸弹 XercesDOMParser - C++

c++ - C++ std::vector 是否比 C99 可变长度数组慢?

c++ - 如何优化字符串复制(内存分配)?

对象 vector 上的 C++ remove_if

c++ - 如何禁用然后启用 MessageBox 中的重试按钮?

java - 阻塞或非阻塞 - 在 Java 的 HashMap 中重新散列期间添加元素

java - 将 TreeMap 修剪为 n 个条目

java - addAll(Collection).. 不适用于参数(Iterable)