c++中vector的一个特点是: 内存空间只会增长,不会减小。即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储设想,如果每次vector添加一个新元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能就会非常慢,所以,实际上分配时其容量要比当前所需容量更多,即vector预留了一些额外的存储区,这样就不必单独为每个新元素重新分配内存空间,减少开销。 另外,在vector中内存只增不减体现在 - 比如首先分配了10000个字节,然后erase掉后面9999个,留下一个有效元素,但是实际上内存占用仍然为10000个,所有内存空间是在vector析构的时候才能被系统回收。所以,即使使用clear,vector所占用的内存空间依然如故,无法保证内存的回收。

  当然,对于数据量很小的vector,完全没有必要进行主动释放,就比如200 * 200的网格计算,就是没有必要的,但是如果是1000 * 1000,那么就是前者的25倍了,这时就需要进行主动内存释放了。

  另外,既然要进行内存释放,我们不得不掌握size()和capacity()方法的区别,前者是实际的vector元素个数,后者是实际占用内存的个数,一般来说,capacity()是大于或等于size()的。

  所以,我们可以使用swap()来帮助释放内存,具体方法如下:

#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
struct GrainRho
{
int key;
double rho;
}; int main() {
static vector<struct GrainRho> rhovec; static vector<struct GrainRho>::iterator itrho; GrainRho grainRho; for (int i = ; i < ; i++) {
grainRho = {i, 0.5 + double(i)};
rhovec.push_back(grainRho);
} rhovec.clear();
cout << "rhovec.size(): " << rhovec.size() << endl;
cout << "rhovec.capacity(): " << rhovec.capacity() << endl; vector<struct GrainRho>().swap(rhovec); grainRho = {, 6.28};
rhovec.push_back(grainRho);
cout << "rhovec.size(): " << rhovec.size() << endl;
cout << "rhovec.capacity(): " << rhovec.capacity() << endl; system("pause");
}

如上所示,首先我们给这个rhovec存入了很多元素,然后调用clear()函数,但是实际上内存还是没有释放而是继续占用的,所以,我们使用 “vector<struct GrainRho>().swap(rhovec)” 来释放内存,最后又存入一个grainRho,所以最终结果只有一个grainRho占用内存。

最终结果如下所示:

rhovec.size():
rhovec.capacity():
rhovec.size():
rhovec.capacity():

如上所示,我们就很好的解决了内存占用问题!

  

c++ vector的内存释放的更多相关文章

  1. 关于vector的内存释放问题

    以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObjec ...

  2. vector的内存释放

    转自:http://www.cnblogs.com/summerRQ/articles/2407974.html vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自 ...

  3. [C++]STL容器Vector的内存释放

    直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...

  4. std::vector的内存释放

    先上一段代码 using namespace std; class A{ public: ~A(){ cout << "deconstruct"; }; }; #inc ...

  5. CPP-STL:vector的内存释放

    1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...

  6. vector 内存释放相关

    在使用vector 存储char 类型时 new的数据 在vecto 执行rerase的时候或者 单项执行clear 内存是不能被释放的. 比如有下面的一个测试: class SnapshotInfo ...

  7. (转)C++ STL中的vector的内存分配与释放

    C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...

  8. STL 内存释放

    C++ STL 中的map,vector等内存释放问题是一个很令开发者头痛的问题,关于 stl内部的内存是自己内部实现的allocator,关于其内部的内存管理本文不做介绍,只是 介绍一下STL内存释 ...

  9. vector的内存分配与释放

    1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最 ...

随机推荐

  1. FOB cost---从工厂到码头的费用

    1.主要是港杂费:陆运400元起,2个方450元,三个方500元,3个方以上按100元/方算起.

  2. FortiGate双链路不同运营商上网配置

    1.防火墙端口配置 2.LLB配置

  3. Python练习-生成器、迭代器-2018.12.01

    如果列表元素可以按照某种算法推算出来,可以在循环的过程中不断推算出后续的元素.这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generat ...

  4. 【mac环境】终端配色 & 配置使用ll命令

    1.MAC OS X 命令终端的颜色显示 打开 terminal 会发现 ls 和 grep 后的结果是没有色彩的,这时候可以这么干: 用 vim 打开文件 ~/.bash_profile,然后把下边 ...

  5. zabbix自定义监控

    有的时候zabbix提供的监控项目,不能满足我们生产环境下的监控需求,此时我们就要按照zabbix的规范自定义监控项目,达到监控的目的 zabbix_get:模拟zabbix_server和agent ...

  6. 三 分析easyswoole源码(启动服务&TableManager,略提及Cache工具的原理)

    前文连接,讲了es是如何启动swoole服务的. 里面有一个工具类TableManager.这个类为了处理进程间数据共享.是对swoole_table的一层封装swoole_table一个基于共享内存 ...

  7. 查看windows上次开机时间

    首先在电脑上找的[计算机]图标,点击鼠标右键弹出下拉菜单,在下拉菜单里找到[管理]选项 点击下拉菜单里的[管理]选项,弹出计算机管理界面,在左侧菜单栏里的系统工具里可以看到[事件查看器]菜单 点击[时 ...

  8. Spring 框架下 (增 删 改 )基本操作

    //applicationContext.xml 配置文件 <?xml version="1.0" encoding="UTF-8"?><be ...

  9. AndroidStudio 3 export jar file

    1.  File -> New -> New Module -> Android Library  例子中暂命名ModuleA 2. 修改刚创建 ModuleA下的build.gra ...

  10. 【微信小程序开发】页面配置

    app下的app.json文件是全局配置. app下的每一个page中,也可以配置.json文件. page中配置的内容是对应app中window配置项下的内容. page中的配置将覆盖window中 ...