免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2615 | 回复: 4

请教一个vector容器的内存使用问题。 [复制链接]

论坛徽章:
0
发表于 2011-09-06 10:04 |显示全部楼层
30可用积分
本帖最后由 toniz 于 2011-09-06 10:06 编辑
  1. #include <vector>
  2. #include <deque>
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;

  6. int main(int argc, char *argv[]){
  7.         string ok;
  8.         int *pp1=new int[20000000];
  9.         memset(pp1,0x00,20000000);  //4898 * 4K
  10.         delete [] pp1;  
  11.         cerr<<"After create memroy 1, please check the memory"<<endl;
  12.         cin>>ok;
  13.         vector<string > all_results;
  14.         all_results.resize(1000000);       //7827 * 4K
  15.         cerr<<"After resize 10000000, please check the memory"<<endl;
  16.         cin>>ok;
  17.         all_results.clear();
  18.         all_results.resize(10);
  19.         int *pp2=new int[20000000];
  20.         memset(pp2,0x00,20000000);   //4898  * 4K
  21.         delete [] pp2;  
  22.         cerr<<"After create memroy 2, please check the memory"<<endl;
  23.         cin>>ok;
  24. }
  25. //12712* 4K
复制代码
上面的代码分三个部分申请内存,我用SVMON 观察,如果是每部都拆开,那么第一步和第三步都是使用4898个4K页面,第二步使用7827个页面。

但如果串起来一起运行的话,最后占用的内存就是12712个页面。

第一步的数组,内存删除后,可以被VECTOR容器使用。 也就是我用SVMON 观察,第一步内存使用4898个页面,第二版用了7827个页面。但VECTOR调用了RESIZE之后页面就一直占用了。

就算我在下面加上 clear 和重新resize  ,这部分内存也没被释放。

请大牛指点一下。。谢谢

最佳答案

查看完整内容

如果你想手工释放vector里面的动态内存,可以这么做……{ vector temp_; temp.swap( all_results );}……

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2011-09-06 10:04 |显示全部楼层
本帖最后由 bruceteen 于 2011-09-06 10:44 编辑

如果你想手工释放vector里面的动态内存,可以这么做

……
{
    vector<string> temp_;
    temp.swap( all_results );
}
……

评分

参与人数 1可用积分 +2 收起 理由
OwnWaterloo + 2 all_results.swap(vector()); //?

查看全部评分

论坛徽章:
0
发表于 2011-09-06 10:11 |显示全部楼层
本帖最后由 xyfree 于 2012-01-21 04:20 编辑

评分

参与人数 1可用积分 +5 收起 理由
toniz + 5 谢谢~~

查看全部评分

论坛徽章:
0
发表于 2011-09-06 10:48 |显示全部楼层
我又用一个代码测试了下,证明如果超出变量作用域或者调用三楼的方法,内存就不会叠加使用了。



谢谢上面两位,问题解决。

论坛徽章:
0
发表于 2011-09-06 10:53 |显示全部楼层
{:3_198:}不过感觉AIX的内存管理机制会和STL的这个设计产生冲突。

因为AIX的进程内存是申请了就不返回给系统的。所以如果一个类里面使用了这写容器,那么容器也是一直保持最大的容量。那么AIX的进程使用的内存就会越来越来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,早鸟票抢购!

PostgreSQL中国大会,早鸟票抢购!
2019年11月29~11月30日,由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。




----------------------------------------

点击报名>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP