首页 > 代码库 > vector内存

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();
 

vector内存