【发布时间】:2015-01-24 06:42:44
【问题描述】:
下面的代码调用foo 并使用while(1) 观察内存使用情况。据我所知,在“完成”打印后,var d 被释放,STL 容器将自行释放数据空间(堆)。
#include <vector>
#include <string>
#include <iostream>
void foo() {
std::vector<std::string> d(100000000);
for(int i = 0; i < 100000000; ++i) d[i] = "1,1,3";
d.resize(0);
d.shrink_to_fit();
}
int main(int argc, char *argv[])
{
foo();
std::cout << "finished" << std::endl;
while(1) {;}
return 0;
}
但是我观察到的(使用htop):内存没有释放回操作系统。这只是一个板凳和与MESOS相关的真实代码,每个进程都有内存限制。
我已经在带有 glibc 2.15 的 linux 服务器上尝试了多个版本的编译器,例如 g++-4.7.2 g++-4.8.1、clang++。此外,我也使用 tcmalloc 而不是默认的 malloc,但它仍然不起作用(在 MAC 机器上不会发生问题)。
有什么问题?如何确保内存回馈给操作系统? 谢谢。
【问题讨论】:
-
其他人或许可以在标准中指出,但基于this页面
delete只需释放内存,未指定必须将其返回给操作系统离开。如果您想保证这一点,您可能需要编写自己的new和delete版本,它们使用您操作系统的函数调用并确保内存实际返回给操作系统。
标签: c++ memory stl operating-system glibc