zoukankan      html  css  js  c++  java
  • 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;
    第三部分的内容只是想法,还没有验证。
  • 相关阅读:
    739. Daily Temperatures
    556. Next Greater Element III
    1078. Occurrences After Bigram
    1053. Previous Permutation With One Swap
    565. Array Nesting
    1052. Grumpy Bookstore Owner
    1051. Height Checker
    数据库入门及SQL基本语法
    ISCSI的概念
    配置一个IP SAN 存储服务器
  • 原文地址:https://www.cnblogs.com/Frandy/p/Vector_Clear_Memory.html
Copyright © 2011-2022 走看看