- 主题:问一个container内存释放的问题
外行救助。
container分配的内存如何才能彻底释放?
测试了很多办法,vector,set,map一类的container,不论是clear,erase,还是swap,
delete都不会将内存返回系统。
查资料说这样优化是为了速度更快,因为每次分配内存再释放内存很慢。
但是如果这样,碰巧建了一个超大的临时map,内存就是被一直占着。清空后下次再用的时候,确实内存不会增加,但是也不减少,就这么一直占着。
请问如何才能将内存返回给OS?
C++11. OS Ubuntu 18.
代码大概是这个样子
class C {
vector<int> a;
vector<int> *b;
C(){
b= new vector<int>();
for (int i=0;i<10000000000;i++){
a.push_back(i);
b->push_back(i);
}
}
~C(){
vector<int>().swap(a);
delete b;
}
};
main(){
//check memory here
for (int i=0;i<10;i++){
C *c = new C();
delete c;
}
//check memory here
}
--
FROM 159.226.67.*
又不是容器的问题,是malloc库的问题
--
FROM 27.186.197.*
不过你vector<int> *b; 是为什么啊?直接vector不行吗?一定要指针?
--
FROM 152.78.0.*
析构不就完了
【 在 confusing () 的大作中提到: 】
: 外行救助。
:
: container分配的内存如何才能彻底释放?
:
--
FROM 111.201.149.144
//check memory here 是咋check
【 在 confusing () 的大作中提到: 】
: 外行救助。
:
: container分配的内存如何才能彻底释放?
:
--
FROM 138.19.103.*
确实没啥意义,vector元素都是开在堆上的吧
【 在 one4all4one 的大作中提到: 】
: 不过你vector<int> *b; 是为什么啊?直接vector不行吗?一定要指针?
来自 HMA-AL00
--
FROM 111.199.188.*
Generally, the heap is not shrunk after each free. Instead, the malloc() implementation keeps freed memory around for a subsequent allocation. Only when the size of the heap is significantly larger than the amount of allocated memory does malloc() shrink the data segment. A large allocation, however, can prevent this shrinkage.
Consequently, for large allocations, glibc does not use the heap. Instead, glibc creates an anonymous memory mapping to satisfy the allocation request.
【 在 confusing 的大作中提到: 】
: 外行救助。
: container分配的内存如何才能彻底释放?
: 测试了很多办法,vector,set,map一类的container,不论是clear,erase,还是swap,
: ...................
--
FROM 71.95.251.*
那这个怎么解决?
【 在 pgw (pppppppgw) 的大作中提到: 】
: 又不是容器的问题,是malloc库的问题
--
FROM 159.226.67.*
测试一下
就是指针不指针都不能返还内存给系统
【 在 one4all4one (one4all4one) 的大作中提到: 】
: 不过你vector<int> *b; 是为什么啊?直接vector不行吗?一定要指针?
--
FROM 159.226.67.*
不行
【 在 Tyo (T3|等待原来苍老了你我|彻底沦为IT民工) 的大作中提到: 】
: 析构不就完了
--
FROM 159.226.67.*