【发布时间】:2015-10-16 18:21:37
【问题描述】:
我正在尝试更多地了解 C++ 中如何处理内存,并且我有一个关于重新分配变量时如何释放内存的问题。为了监控内存消耗,我有一个(Linux 特定的)函数CheckMem(),它调用pmap 来查看进程正在使用多少内存。
然后我简单地创建一个大小为 1 的向量,将其重新分配给大小为 100 万的向量,然后再次将其重新分配给大小为 1,并观察内存如何变化。
#include <iostream>
#include <vector>
#include <sstream>
#include <cstdio>
#include <unistd.h>
using namespace std;
void CheckMem()
{
char cmdstring[100],outbuf[500],buf[100];
sprintf(cmdstring,"pmap -x %d | tail -1",getpid());
FILE* output = popen(cmdstring,"r");
fgets(outbuf,500,output);
size_t kb,rss,dirty;
istringstream ss(outbuf);
ss >> cmdstring >> buf >> kb >> rss >> dirty;
cout << "RSS: " << rss << " KB" << endl;
}
int main()
{
vector<double> vd(1);
CheckMem();
vd = vector<double>(1000000);
CheckMem();
vd = vector<double>(1);
CheckMem();
return 0;
}
如果我使用 g++(gcc 版本 4.8.4)编译,我会得到以下输出:
RSS: 1184 KB
RSS: 9128 KB
RSS: 9136 KB
当向量重新分配为大小 1 时,用于大向量(100 万倍 ~ 8 MB)的内存似乎没有释放。
但是,如果我使用标志-std=c++11 进行编译,那么输出会发生变化:
RSS: 1180 KB
RSS: 9112 KB
RSS: 1300 KB
现在内存似乎被重新分配释放了。 C++11 标准是否以某种方式对重新分配的内存进行了不同的处理?
【问题讨论】:
标签: c++ linux c++11 memory vector