vector内存释放方法

来源:互联网 发布:php mktime函数 编辑:程序博客网 时间:2024/05/24 05:29

vector容器是自增长的。一般的,在容器对象中insert或push一个元素时,该对象的大小增加1。.

而且vector中的元素是连续存放的,当在容器中增加一个新元素时,如果原来的储存空间刚好被用完,那么系统需要重新寻找一个更大的连续储存空间,把原来的元素复制到新空间,并在最后添加新元素,最后再撤销旧空间。更特殊情况下,假设每次vector添加一个元素时,空间都被用完,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。

关于vector的内存空间,有两个函数需要注意:size()成员指当前拥有的元素个数;capacity()成员指当前(容器必须分配新存储空间之前)可以存储的元素个数。reserve()成员可以用来控制容器的预留空间。

每当系统预先分配一块capacity大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。

这样便造成一个问题,即使 你使用clear()函数清空容器,系统为容器分配的capacity大小的空间依然存在。

而调用reserve(0),也不能使容器的预留空间变为0。

所以在相关资料中有人提到以swap()函数来释放vector内存。

vector<int> ivec(5,2); //使用5个整形数值2初始化
vector<int>().swap(ivec); // 释放vector内存的一种方式:利用swap函数,和临时对象交换

下面举个例子来说明vector的存储状态:

#include<iostream>using namespace std;#include<vector>int main(){    vector<int> ivec(5,2);      //使用5个整形数值2初始化    for(int i=0; i<ivec.size(); i++)        cout<<ivec[i];          //使用下标访问每个元素    cout<<endl;    ivec.push_back(3);          //尾部添加3    ivec.insert(ivec.begin(),1);    //在ivec头添加元素1,注意该操作时间复杂度为O(n)    for(vector<int>::iterator it = ivec.begin(); it != ivec.end(); it++)        //使用迭代器访问每个元素        cout<<*it;    cout<<endl;    ivec.clear();           //将容器清空,并未释放内存    cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl;//  ivec.reserve(0);        //设置对象实际占用的储存空间(实际上只能额外增加对象实际占用空间),reserve(0)在这里并没有用。    vector<int>().swap(ivec);   //  释放vector内存的一种方式:利用swap函数,和临时对象交换,                                //  使S对象的内存为临时对象的内存一样,而临时对象的内存为S对象的内存。                                //  交换以后,临时对象消失,释放内存。    cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl;    for(int i=0; i<10; i++)        ivec.push_back(i);    cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl;    for(int i=0; i<90; i++)        ivec.insert(ivec.end(),i);    cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl;    ivec.reserve(200);    cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl;    return 0;

以上代码执行结果:
22222
1222223
size:0 capacity:10 //clear()后,size为0。但是capacity仍为10
size:0 capacity:0 //swap()后内存释放
size:10 capacity:16
size:100 capacity:128
size:100 capacity:200

Press ENTER or type command to continue

0 0