zoukankan      html  css  js  c++  java
  • vector内存

    一、vector的内存增长

      vector内存的特点:内存空间只会增长,不会减少

      vector支持随机访问,vector容器的元素以连续的方式存放,每个元素都紧挨着前一个元素存储。当vector插入数据时,可能空间不够,这时要重新分配新的内存,将数据从旧空间拷贝到新空间,然后释放旧空间,这样性能难以接受,因此每次对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说vector预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配这个容器的空间。当预留空间不够的时候,vector会按一种规律进行重新分配内存:

      vs下,vector空间不够时,增加现有空间的一半,原有空间为10,空间不够则增加5,空间大小为15
      vc6.0,vector空间不够时,增加一倍,原有5,不够,增加5,为10
    二、vector的内存释放
      由于vector内存只增不减,如果你先分配了100个字节,然后erase掉后面99个,留下一个有效元素,但是内存仍然是100个字节,所有内存空间是在vector析构时候才能被系统回收。
      empty用来检测容器是否为空,clear可以清空所有元素,但是clear后,vector占用的空间不变,无法保证内存的回收
      如果想使空间动态的缩小,可以考虑使用deque。
      《Effective STL》中的“条款17”:
        当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前数据所需
      《Effective STL》给出的解决方案是:
        vector<type> v;
        //.... 这里添加许多元素给v
        //.... 这里删除v中的许多元素
        vector<type>(v).swap(v);
        //此时v的容量已经尽可能的符合其当前包含的元素数量
        //对于string则可能像下面这样
        string(s).swap(s);
      重点:使用swap()来帮助vector释放内存。方法如下:
      vector<A>().swap(vec);
      或者vec.swap(vector<A>());
    三、如果vector中存放的是指针,那么当vector销毁时,这些指针指向的对象不会被销毁,那么内存就不会被释放。
      vector<A*> vec;
      vec.push_back(new A());
      vec.push_back(new A());
      这时,必须要手动释放vec里面的指针指向的内存:
      for(vector<A*>::iterator it = vec.begin(); it != end(); ++it)  
      {
        if(NULL !+ *it)
        {  
          delete *it;
          *it = NULL;
        }
      }
      vec.clear();
     
  • 相关阅读:
    图表算法—有向图
    图表算法—无向图
    搜索算法—哈希表
    红黑树的删除
    搜索算法—红黑树
    搜索算法—二叉搜索树
    排序算法—堆排序
    快速排序改进——3区快速排序(3-way quicksort)
    数论——约数:算数基本定理及推论,欧几里得算法
    数论——乘法逆元(快速幂求法)及模运算
  • 原文地址:https://www.cnblogs.com/vinke2013/p/7209096.html
Copyright © 2011-2022 走看看