STL---vector内存分配
来源:互联网 发布:国外社交软件排名 编辑:程序博客网 时间:2024/04/28 09:54
[置顶] STL容器vector的内存问题
- •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:
- vector<int> tmp; //tmp为空
- vec.swap(tmp); //vec和tmp交换指向的内存空间
如果代码想要更加精简,则可以选择下面的写法:
- vec.swap(vector<int>());//vec与临时对象交换了指向的内存空间
上面两种方式都使用一个没有数据的vector对象与当前vetor对象进行了交换,对于vec来讲,其内存空间缩减为0,同理,若想vec变为指定大小,则只需要与一个大小一样的vector对象进行swap即可。
4、预先申请内存空间
若一开始就大概确定需要的内存空间,则可以使用vector的reserve()函数预先申请足够的内存空间,这样做,既可以减少内存增长时的申请内存和数据移动的开销,避免了迭代器失效的问题,也防止了申请了超出预期的的内存空间,导致内存耗尽的问题;若一开始不确定需要的内存空间,则可以先预留足够大的空间,当所有数据都插入后,通过swap()函数去除多余的容量即可。
- 顶
- 60
- 踩
- 0
- 上一篇STL容器List的一个小技巧
- 下一篇STL容器的删除元素问题
我的同类文章
- •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
- STL---vector内存分配
- stl-vector内存分配
- STL中vector内存分配策略剖析
- STL----vector的内存分配与释放
- STL中vector的内存分配机制
- STL vector内存分配测试笔记
- STL中Vector的内存分配机制
- STL之vector分配内存问题
- C++ STL vector内存分配与内存增长问题
- C++ STL中的vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- STL中vector的内存分配与释放
- STL中vector的内存分配与正确释放
- C++ STL中的vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- arm浮点编译参数
- javaScript的事件集合大全
- 《TCP/IP详解 卷1:协议》第十八章 TCP连接的建立与终止
- Android Fragment生命周期及各个方法使用
- 对大学生学习Linux系统的七项实用建议
- STL---vector内存分配
- c++多线程编程
- Python安装第三方包
- css --关于背景图片显示不出来的情况
- STL标准模版库---set操作
- log4j.properties配置与加载应用
- JS验证表单集合大全
- Oracle中用exp/imp命令参数详解
- codevs1226 倒水问题 bfs