为什么我的程序内存不释放?
Why does my program's memory not release?
#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
/delete
和 malloc
/realloc
/free
使用 sbrk()
或特定于操作系统的等效项从操作系统中安排更多内存,并按照它们喜欢的方式划分页面以满足程序的分配请求。 尝试将小页面释放回操作系统是不值得的 - 跟踪仍然是/不是池一部分的页面、重新请求它们等太多额外的开销。 在内存不足的情况下,正常的缓存机制将允许将长期未使用的内存页从物理 RAM 中换出。
FWIW,GNU libC的malloc
等人对特别大的请求做了一个例外,因此它们可以在程序终止之前完全发布给操作系统/其他程序使用;引用这里的NOTES部分:
当分配大于
MMAP_THRESHOLD
字节的内存块时,glibcmalloc()
实现将内存分配为专用匿名映射 使用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;
}
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?