我做了一个小小的实验,代码如下:
vector<char> *p = new vector<char>[1024];
for (size_t i = 0; i < 1024; i++)
{
(*p++).resize(1024 * 1024);//alloc 1 G memory
}
sleep(5);
cout << "start to clear" << endl;
for (size_t i = 0; i < 1024; i++)
{
vector<char> tmp;
tmp.swap(*p++);
}
delete [] p;
cout << "clear over!" << endl;
sleep (5);
//这里,内存还是1G,为什么?非常感谢你。
答案 0 :(得分:5)
在大多数实现中,内存不会立即返回到操作系统,而是放入“空闲列表”,因为从操作系统获取内存通常比走这样的空闲列表更昂贵。这很可能是为什么你仍然可以看到1gig的内存,无论你在哪里检查。
此外,在您的代码中,我没有看到在保留所有向量后重置p
的位置,您基本上将空向量与不属于您的未初始化内存交换。
答案 1 :(得分:3)
您没有将p重置为两个循环之间的初始值。第二个循环不会清除初始p,它会在为初始p分配的内存后与随机内存混淆。
我建议您使用(*(p + i))
或(p + i)->
或p[i]
代替(*p++)
。或者甚至更好,使用vector<vector<char> >
。而不是与临时矢量交换。使用clear()成员函数。
编辑:这是两个不错的实现
vector<char>* p = new vector<char>[1024];
for( size_t i = 0; i < 1024; i++ ){
p[i].resize(1024 * 1024);
}
sleep(5);
cout << "start to clear" << endl;
for( size_t i = 0; i < 1024; i++ ){
p[i].clear();
}
delete [] p;
cout << "clear over!" << endl;
sleep(5);
vector<vector<char> > p(1024);
for( size_t i = 0; i < 1024; i++ ){
p[i].resize(1024 * 1024);
}
sleep(5);
cout << "start to clear" << endl;
for( size_t i = 0; i < 1024; i++ ){
p[i].clear();
}
cout << "clear over!" << endl;
sleep(5);