向量保持存储器甚至可以与另一个空向量交换

vector hold memory even swap with an another empty vector

本文关键字:向量 另一个 交换 存储器      更新时间:2023-10-16

我做了一个小实验,代码如下:

    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,为什么?非常感谢。

在大多数实现中,内存不会立即返回到操作系统,而是放入"空闲列表"中,因为从操作系统获取内存通常比遍历这样的空闲列表要贵得多。这很可能就是为什么无论你在哪里检查,你仍然能看到1GB的内存。

此外,在您的代码中,我看不出在保留所有向量后在哪里重置p,基本上是用不属于您的未初始化内存交换空向量。

在两个循环之间没有将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);