C ++ 11内存释放variables重新分配

我想了解更多关于如何在C ++中处理内存,我有一个关于如何重新分配variables时释放内存的问题。 为了监视内存消耗,我有一个(特定于Linux的)函数CheckMem() ,它调用pmap来查看进程正在使用多less内存。 然后我简单地创build一个大小为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 

看来用于大型vector的内存(100万双〜8 MB)在向量被重新分配为1时不会被释放。但是,如果我使用flag -std=c++11编译,则输出会发生变化:

 RSS: 1180 KB RSS: 9112 KB RSS: 1300 KB 

现在内存似乎被重新分配释放。 C ++ 11标准是否以不同的方式处理内存以重新分配?

只要图书馆的执行者大于向量所分配的向量的容量,图书馆的实施者就会重新使用向量的容量。 这样他们节省了内存分配。

从C ++ 11开始,我们已经移动了赋值,所以当你使用-std=c++11编译而不是重新使用临时向量被移动到现有向量的容量时,原始向量的内容被移动到临时目录中。 在表达式的结尾,临时的被破坏,你现在有一个容量较小的向量。

如果你想缩小向量的容量,你应该检查一下: 减少一个stl向量的容量

不同的是在C ++ 11中引入的移动分配。 在此之前,你只有复制构造函数,如果容量足够大,将复制新矢量到旧矢量中。

随着C + + 11和移动分配新的矢量的数据替换旧的,然后销毁。