据我所知,STL具有自动内存管理功能。但是,当我使用top
或ps -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
检查发生了什么之后,我得到了正常结果。
所以我的问题来了
valgrind
不符答案 0 :(得分:4)
这是完全正常的。这就是操作系统的工作方式。如果他们花费所有时间从微小的进程中回收内存的微小部分,那么他们将永远别无选择。
您只需要相信他们复杂的算法知道他们在做什么才能为您的系统获得最佳性能。
在逻辑层的每一层上都有一层,这些层一直分配物理RAM直到进程的虚拟内存。
关于操作系统如何工作的极端细节既不在本文讨论范围之内,也毫无意义。但是,如果您真的想掌握所有相关知识,则可以参加相关的教学课程。
如果我们忘记了缓存和虚拟内存之类的东西,那么即使是一个简单的经验法则也可以总结如下:从程序中释放内存告诉操作系统它可以将其取回。这并不意味着操作系统必须将其收回。