gpt4 book ai didi

c++ - std::unordered_map 析构函数不释放内存?

转载 作者:行者123 更新时间:2023-12-01 14:48:47 24 4
gpt4 key购买 nike

根据标准,当调用 std::unordered_map 的析构函数时(例如,当它离开创建它的范围时),人们期望它分配的内存被释放。然而,我在多台机器上运行的一个简单实验似乎与此冲突?考虑以下程序:

    #include <chrono>
#include <iostream>
#include <map>
#include <unordered_map>
#include <memory>
#include <thread>
#include <vector>

void CreateMap() {
std::unordered_map<int, int> testMap;

for (int i=0; i < 10000000; i++) {
testMap[i] = 5;
}

std::cout << "finished building map" << std::endl;

std::this_thread::sleep_for (std::chrono::seconds(15));

std::cout << "about to exit from CreateMap()" << std::endl;
}

int main()
{
CreateMap();

CreateMap();

CreateMap();
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(1));
}

return 0;
}

在我的机器上, map 构建完成时会消耗 10% 的 RAM,但最后我们在 CreateMap() 中休眠。然而,在退出 RAM 后仅下降到 8%(可以使用各种大小的 map 来显示 map 本身负责超过 2%)所以人们会期望 CreateMap 泄漏内存?然而,对 CreateMap() 的 3 次调用或仅一次调用似乎没有什么不同(所以内存被回收到程序而不是 RAM?)。

这可能是我不理解的操作系统内存管理的一些奇怪之处,即程序可以释放内存以供其 future 使用( future 分配)但不能释放给操作系统(即,用于其他程序中的内存分配) )?

最佳答案

你测试错了。代码不会泄漏,但释放的内存不一定可用于其他进程(您正在测量的内容) - 它可能仍会被同一进程声明以供将来分配。

例如,移除无限循环后,减少 i 的限制为了适合我的测试沙箱,我在 Valgrind 下运行了代码:

valgrind --leak-check=full ./60112215   
==3396096== Memcheck, a memory error detector
==3396096== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==3396096== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==3396096== Command: ./60112215
==3396096==
finished building map
about to exit from CreateMap()
finished building map
about to exit from CreateMap()
finished building map
about to exit from CreateMap()
==3396096==
==3396096== HEAP SUMMARY:
==3396096== in use at exit: 0 bytes in 0 blocks
==3396096== total heap usage: 300,044 allocs, 300,044 frees, 13,053,168 bytes allocated
==3396096==
==3396096== All heap blocks were freed -- no leaks are possible
==3396096==
==3396096== For lists of detected and suppressed errors, rerun with: -s
==3396096== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

如果你想真正为自己演示,可以调用 CreateMap()更多次,看到进程的内存使用量没有增加:
int main()
{
for (auto i = 0; i < 100; ++i) {
CreateMap();
}
}

它显然是在重复使用在上一次迭代中释放的内存。

关于c++ - std::unordered_map 析构函数不释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60112215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com