为什么程序的内存不能释放?

fra*_*lin 0 c++ memory deque

#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

Ton*_*roy 6

通常,new/ deletemalloc/ realloc/ free使用sbrk()或特定于操作系统的等效操作从OS安排更多内存,并将页面分开但是他们喜欢满足程序的分配请求.试图将小页面重新发布回操作系统是不值得的 - 太多的额外开销跟踪仍然/不是池的一部分的页面,重新请求它们等等.在内存不足的情况下,正常的缓存机制将允许很长时间 - 无论如何都要将未使用的内存页交换出物理RAM.

FWIW,GNU libC malloc等.对特别大的请求进行例外处理,以便在程序终止之前完全释放它们以供OS /其他程序使用; 引用NOTES部分:

当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc() 实现使用mmap(2)将内存分配为私有匿名映射. MMAP_THRESHOLD默认为128 kB,但可以使用mallopt(3)调整.使用mmap(2)执行的分配不受RLIMIT_DATA资源限制的影响(参见getrlimit(2)).