STL不会从系统级别释放内存

时间:2018-12-11 13:14:10

标签: c++ memory stl

据我所知,STL具有自动内存管理功能。但是,当我使用topps -aux之类的东西来显示进程的内存使用情况时,它表明即使STL对象也超出范围,这些内存仍由进程拥有。

这里是一个例子:

void run()
{
    map<int, int> a;
    for(int i = 0; i < 1000000; i++)
    { 
        a[i] =  i;
    } // 64376K memory used by process
}

int main()
{
    run();
    sleep(5); // still 64376 memory used
    map<int, int> a;
    for(int i = 0; i < 1000000; i++)
    { 
        a[i] =  i;
    } // still 64376 memory used
    return 0;
}

该进程在run()中拥有64376KB的内存,并且在函数run()之后不释放内存。但是这些内存似乎由第二个map使用。

使用valgrind --tool=massif检查发生了什么之后,我得到了正常结果。

enter image description here

所以我的问题来了

  1. 为什么进程内存趋势与代码和valgrind不符
  2. 不同的STL对象如何共享相同的已分配内存。

1 个答案:

答案 0 :(得分:4)

这是完全正常的。这就是操作系统的工作方式。如果他们花费所有时间从微小的进程中回收内存的微小部分,那么他们将永远别无选择。

您只需要相信他们复杂的算法知道他们在做什么才能为您的系统获得最佳性能。

在逻辑层的每一层上都有一层,这些层一直分配物理RAM直到进程的虚拟内存。

关于操作系统如何工作的极端细节既不在本文讨论范围之内,也毫无意义。但是,如果您真的想掌握所有相关知识,则可以参加相关的教学课程。

如果我们忘记了缓存和虚拟内存之类的东西,那么即使是一个简单的经验法则也可以总结如下:从程序中释放内存告诉操作系统它可以将其取回。这并不意味着操作系统必须将其收回。