vector如何释放空间?

947 阅读2分钟

由于vector的内存占用空间只增不减,比如你首先分配了10,000个字节,然后erase掉后面9,999个,留下一个有效元素,但是内存占用仍为10,000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。

如果需要空间动态缩小,可以考虑使用deque。

如果使用vector,可以用swap()来帮助你释放多余内存或者清空全部内存。

vector(Vec).swap(Vec); //将Vec中多余内存清除; 
vector().swap(Vec); //清空Vec的全部内存;  

实例

#include <iostream>
#include <vector>
using namespace std;

int main ()
{
    vector<int> vec (100,100);   // 100 ints with a value of 100
    vec.push_back(1);
    vec.push_back(2);
    cout <<"vec.size(): " << vec.size() << endl;
    cout <<"vec.capasity(): " << vec.capacity() << endl;

    vector<int>(vec).swap(vec); //清空vec中多余的空间,相当于vec.shrink_to_fit();

    cout <<"vec.size(): " << vec.size() << endl;
    cout <<"vec.capasity(): " << vec.capacity() << endl;

    vector<int>().swap(vec); //清空vec的全部空间

    cout <<"vec.size(): " << vec.size() << endl;
    cout <<"vec.capasity(): " << vec.capacity() << endl;

    return 0;
}
/*
    运行结果:
    vec.size(): 102
    vec.capasity(): 200
    vec.size(): 102
    vec.capasity(): 102
    vec.size(): 0
    vec.capasity(): 0
 */

在C++ STL中,vector的内存空间是由它自己进行管理的。当vector容器不再使用时,它会自动释放其内部分配的内存空间。

vector释放空间的过程主要通过析构函数来完成。当vector对象销毁时,其析构函数会被调用,其中会将容器内的所有元素进行析构,并释放所占用的内存。

此外,vector还提供了一个成员函数clear(),用于清空容器中的所有元素,但不会释放底层的存储空间。如果需要显式释放vector内部的内存空间,可以使用swap()函数来实现。

例如,可以通过以下方式释放vector内存空间:

std::vector<int> myVector;
// 向myVector添加元素...

// 清空vector中的元素,但保留内存空间
myVector.clear();

// 释放vector内存空间
std::vector<int>().swap(myVector);

在上述代码中,调用clear()函数清空了vector中的元素,但保留了内部的存储空间。然后,通过创建一个临时的空vector对象,再调用swap()函数将其与原来的vector对象进行交换,从而释放了内部的内存空间。最终,原来的myVector对象成为空vector,其内存空间也被释放。

需要注意的是,在C++11之后,vector也提供了一个成员函数shrink_to_fit(),用于请求vector减少其内部存储的容量以匹配其大小。但该函数并不保证一定会收缩容量,具体是否减小容量是实现相关的。