Vector的内存释放

  最近跑一个程序,结果2G内存用完了,结果也没算出来,出现std::bad_alloc,应该是程序中某个地方内存空间没有及时释放,开始检查程序。发现好多地方用到vector,而且有些会很大,并且只是中间结果,只是因为需要在多个地方访问,定义为了类的成员变量,要等到这个类解析的时候才释放空间,看来应该在程序中,它的中间作用结束之后便释放内存。于是开始探索如何释放vector的内存。

1、vector的成员函数 clear()

clear()只是清除vector中的变量,并不释放内存。一个简单的测试程序如下,

 
  
int main(){
  vector
< double > a;
  
for (unsigned int i = 0 ;i < 10 ;i ++ ){
  a.push_back(i
+ i / 10 );
  }
  cout
<< a.size() << " " << a.capacity() << endl;
  a.clear();
cout << a.size() << " " << a.capacity() << endl;
   return 0 ;
}

输出是:

10   16

0    16

size给出vector中的元素个数,capacity给出vector占用的内存大小,单位是vectot中的元素类型占用的内存大小。

可以看到,vector申请的内存空间并不是与元素个数相等,vector的内存空间是可以动态增长的,比如一开始vector<double> a只申请了4个double的空间,当元素个数超过4个时,vector重新分配内存。最后有10个元素时,vector占用16个double的空间。当执行clear之后,元素个数为0,但占用的内存空间没变,也就是说,vector<double> a占用的内存空间没有得到释放。由于它不是new申请的空间,所以不能使用delete。那么该如何释放这样的内存空间呢?

2、swap方法

在 http://topic.csdn.net/u/20091202/15/817018d4-e0fc-4229-94b7-0869c9366a53.html 给出了两种释放vector占用内存的方法,试用了一下。

 
  
a.swap(vector < double > ());

编译的时候报错了, error: no matching function for call to ‘std::vector<double, std::allocator<double> >::swap(std::vector<double, std::allocator<double> >)’/usr/include/c++/4.4/bits/stl_vector.h:929: note: candidates are: void std::vector<_Tp, _Alloc>::swap(std::vector<_Tp, _Alloc>&) [with _Tp = double, _Alloc = std::allocator<double>]

swap的参数应该是一个vector的引用,虽然swap是通过将vector<double> a与一个临时变量的空间交换,交换之后,a的空间为0,临时变量的空间为a之前的空间,然后临时变量在这个过程结束的时候,内存空间被释放。这样达到释放a的空间,在a不是临时变量的时候。将上面的一条语句改为两条,

 
  
vector < double > b;
a.swap(b);

这样便不会报错了。这是引用和值传递的区别。

文章中还给出了一种方法,试了一下,占用空间没有改变,不知道为什么。链接给出的文章讲了部分内容,可做参考。 http://oss.org.cn/?action-viewnews-itemid-3744

3、数组元素为指针的时候的内存释放

很多时候,我们会用vector保存一组指针,

 
  
vector < classType *> S;

{
classType
* item = new classType();
S.push_back(item);
}

这个时候,swap也只是清空这些指针占用的空间,但指针指向的类的实例占的空间是没有被释放的。对于这种vector,需要手动地释放这些空间。

 
  
classType * item = NULL;
for (i = 0 ;i < S.size();i ++ ){
item
= S[i];
  //释放vector指针元素指向的空间
delete (classType
* ) item;
}
vector<classType*> Stmp;
//释放vector占用的空间
S.swap(Stmp);

在一个函数内部,临时变量在函数退出时释放内存,如果想尽快释放掉内存,可以考虑用new申请临时变量的空间,然后尽快delete。如下,

 
  
vector < classType *> * Stemp = new vector < classType *> ();
S.swap(
* Stmp);
for (i = 0 ;i < Stmp -> size();i ++ ){
delete (clasType
* ) ( * Stmp)[i];
}
delete vector
< classType *> Stmp;
第三部分的内容只是想法,还没有验证。

转载于:https://www.cnblogs.com/Frandy/archive/2011/05/11/Vector_Clear_Memory.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值