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

时间:2015-04-09 03:15:25

标签: 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;
}

通过top,我发现我的程序记忆大约是61M,为什么?如果Node中有复制构造函数,那就没关系了。我想知道原因,而不是如何使其正确。

gcc(GCC)4.9.1,centos

2 个答案:

答案 0 :(得分:6)

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

FWIW,GNU libC&#39; s malloc等。对特别大的请求进行例外处理,以便在程序终止之前可以完全释放它们以供OS /其他程序使用;引自the NOTES section here

  

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

答案 1 :(得分:0)

如果容器为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<<"releas\n";
    sleep(80000000);
    return 0;
}