STL---vector内存分配

来源:互联网 发布:国外社交软件排名 编辑:程序博客网 时间:2024/04/28 09:54

[置顶] STL容器vector的内存问题

标签: C++STLvector内存
3708人阅读 评论(0)收藏举报
本文章已收录于:
分类:
作者同类文章X
  • STL之防止内存泄露
  • 谨慎优化代码
  • STL容器的删除元素问题
  • STL容器List的一个小技巧
  • 更多

       在STL的容器中,vector可以说是最容易理解和使用的容器了,以前使用数组的时候,如果不确定有多少数据要存储,就会预先分配一个大的数组,如果实际没有用到那么多,又会浪费很多的内存资源,如果不分配大的数组又担心不够用,有了vector之后,这些问题再也不用担心了,vector会动态的增长空间,当vector空间不足时会自动申请一片更大的内存空间,以存储新的数据。
       vector动态内存增长的过程如下:
       1) 申请一块更大的内存空间以存储新数据。
       2) 将数据从旧内存空间拷贝到新内存空间。
       3) 析构旧内存空间中的对象。
       4) 释放旧内存空间。
       对于程序员来说,这简直就是一个神器,但是在享受vector带来方便的同时,它也隐藏了一些内存方面的问题,需要我们注意一下。

1、预先分配两倍的内存空间

       对于一个数组,只要通过元素的个数以及元素的类型就可以得到占用的内存空间,而对于vector情况就不一样,为了提高效率,vector会预先分配一定的内存空间,减少申请内存以及数据移动的开销,因此vector实际占用的内存空间要比需要的多一些。
       如果对内存要求比较高的程序,使用vector一定要小心了,当vector空间不足时,会申请一块约是当前占用内存两倍的新空间以存储更多的数据,若可用内存为1G,而当前vector已占用的内存空间0.5G,当再插入一个元素,vector将会申请一块约1G的内存空间,瞬间内存就被用光了,导致程序崩溃。

2、迭代器失效

       当vector空间不足时,会申请一块更大的内存空间,并将原指向内存空间的数据移动到新的内存空间中,接着,旧的内存空间将会被回收。这里就可能会出现问题了,当vector指向新的内存空间之后,原来指向旧内存空间的迭代器都会失效了,若再使用这些失效迭代器,将会出现coredump。因为当需要插入数据到vector的时候,就需要注意当前的迭代器还是否有效了。

3、释放vector所占内存

       vector已经申请的内存空间并不会缩减,即使调用clear()函数,也只是清空vector的所有元素,真正占用的内存空间也不会减少。有一种方法可以释放vector占用的内存空间,swap()函数可以交换两个vector对象所指向的内存空间,
       下面例子说明了swap()函数的使用方法,假设拥有一个vector<int>对象vec:

[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. vector<int> tmp;  //tmp为空  
  2. vec.swap(tmp);      //vec和tmp交换指向的内存空间  

       如果代码想要更加精简,则可以选择下面的写法:

[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. vec.swap(vector<int>());//vec与临时对象交换了指向的内存空间  

       上面两种方式都使用一个没有数据的vector对象与当前vetor对象进行了交换,对于vec来讲,其内存空间缩减为0,同理,若想vec变为指定大小,则只需要与一个大小一样的vector对象进行swap即可。

4、预先申请内存空间

       若一开始就大概确定需要的内存空间,则可以使用vector的reserve()函数预先申请足够的内存空间,这样做,既可以减少内存增长时的申请内存和数据移动的开销,避免了迭代器失效的问题,也防止了申请了超出预期的的内存空间,导致内存耗尽的问题;若一开始不确定需要的内存空间,则可以先预留足够大的空间,当所有数据都插入后,通过swap()函数去除多余的容量即可。

60
0
 
 

我的同类文章

http://blog.csdn.net
  • STL之防止内存泄露2013-12-15
  • STL容器的删除元素问题2013-12-15
  • STL容器vector的下标运算符[]2013-12-15
  • string容易忽略的一些问题2013-12-15
  • 《STL源码剖析》学习之迭代器2013-09-08
  • 谨慎优化代码2013-12-15
  • STL容器List的一个小技巧2013-12-15
  • STL容器map的下标运算符[]2013-12-15
  • STL之一些事一些情2013-12-15
  • 《STL源码剖析》学习之traits编程2013-09-15
0 0