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

Why does my program's memory not release?

本文关键字:释放 内存 我的 程序 为什么      更新时间:2023-10-16
#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<<"releasn";
    sleep(80000000);
    return 0;
}

top,我发现我的程序内存大约是61M,为什么?如果Node中有一个复制构造函数也没关系.我想知道为什么,而不是如何使其正确。

GCC (GCC( 4.9.1, centOS

通常,new/deletemalloc/realloc/free使用 sbrk() 或特定于操作系统的等效项从操作系统中安排更多内存,并按照它们喜欢的方式划分页面以满足程序的分配请求。 尝试将小页面释放回操作系统是不值得的 - 跟踪仍然是/不是池一部分的页面、重新请求它们等太多额外的开销。 在内存不足的情况下,正常的缓存机制将允许将长期未使用的内存页从物理 RAM 中换出。

FWIW,GNU libC的malloc等人对特别大的请求做了一个例外,因此它们可以在程序终止之前完全发布给操作系统/其他程序使用;引用这里的NOTES部分:

当分配大于 MMAP_THRESHOLD 字节的内存块时,glibc malloc() 实现将内存分配为专用匿名映射 使用mmap (2(。 默认情况下,MMAP_THRESHOLD为 128 kB,但 使用mallopt (3( 进行调节。 使用mmap (2( 执行的分配是 不受RLIMIT_DATA资源限制的影响(请参阅getrlimit (2((。

如果容器vector,可以用swap释放内存,容器是deque,应该用clear释放内存,像这样:

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();
    }
    deq.clear();
    // Or, you should try to use `deque<Node>().swap(deq);`, not `local`.
    cout<<"releasn";
    sleep(80000000);
    return 0;
}