#include <iostream>
#include <string>
#include <deque>
#include <vector>
#include <unistd.h>
using namespace std;
struct Node
{
string str;
vector<string> vec;
Node(){};
~Node(){};
};
int main ()
{
deque<Node> deq;
for(int i = 0; i < 100; ++i)
{
Node tmp;
tmp.vec.resize(100000);
deq.push_back(tmp);
}
while(!deq.empty())
{
deq.pop_front();
}
{
deque<Node>().swap(deq);
}
cout<<"releas\n";
sleep(80000000);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过top,我发现我的程序的内存大约是61M,为什么?如果有一个复制构造函数就可以了Node.我想知道原因,而不是如何使它正确.
gcc(GCC)4.9.1,centos
通常,new/ delete和malloc/ realloc/ free使用sbrk()或特定于操作系统的等效操作从OS安排更多内存,并将页面分开但是他们喜欢满足程序的分配请求.试图将小页面重新发布回操作系统是不值得的 - 太多的额外开销跟踪仍然/不是池的一部分的页面,重新请求它们等等.在内存不足的情况下,正常的缓存机制将允许很长时间 - 无论如何都要将未使用的内存页交换出物理RAM.
FWIW,GNU libC malloc等.对特别大的请求进行例外处理,以便在程序终止之前完全释放它们以供OS /其他程序使用; 引用NOTES部分:
当分配大于
MMAP_THRESHOLD字节的内存块时,glibcmalloc()实现使用mmap(2)将内存分配为私有匿名映射.MMAP_THRESHOLD默认为128 kB,但可以使用mallopt(3)调整.使用mmap(2)执行的分配不受RLIMIT_DATA资源限制的影响(参见getrlimit(2)).
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |