#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
答案 0 :(得分:6)
通常,new
/ delete
和malloc
/ realloc
/ free
使用sbrk()
或OS-从操作系统安排更多内存特定的等价物,然后将页面分开,但是他们喜欢满足程序的分配请求。试图将小页面重新发布回操作系统是不值得的 - 太多的额外开销跟踪那些仍然不在池中的页面,重新请求它们等等。在内存不足的情况下,正常缓存无论如何,机制将允许长时间未使用的内存页面从物理RAM中换出。
FWIW,GNU libC&#39; s malloc
等。对特别大的请求进行例外处理,以便在程序终止之前可以完全释放它们以供OS /其他程序使用;引自the NOTES section here:
当分配大于
MMAP_THRESHOLD
字节的内存块时,glibcmalloc()
实现将内存分配为私有匿名映射 使用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;
}