ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

可变重分配中的C 11内存释放

2019-11-19 15:51:51  阅读:226  来源: 互联网

标签:c11 memory vector linux c-4


我试图了解有关C中如何处理内存的更多信息,并且我有一个关于重新分配变量时如何释放内存的问题.为了监视内存消耗,我有一个(特定于Linux的)函数CheckMem(),该函数调用pmap以查看该进程正在使用多少内存.
然后,我简单地创建一个大小为1的向量,将其重新分配为大小为一百万的向量,然后再次将其重新分配为大小为1,并观察内存如何变化.

#include <iostream>
#include <vector>
#include <sstream>
#include <cstdio>
#include <unistd.h>

using namespace std;

void CheckMem()
{
  char cmdstring[100],outbuf[500],buf[100];
  sprintf(cmdstring,"pmap -x %d | tail -1",getpid()); 
  FILE* output = popen(cmdstring,"r");
  fgets(outbuf,500,output);
  size_t kb,rss,dirty;
  istringstream ss(outbuf);
  ss >> cmdstring >> buf >> kb >> rss >> dirty;
  cout << "RSS: " << rss << " KB" << endl;
}

int main()
{
 vector<double> vd(1);
 CheckMem();
 vd = vector<double>(1000000);
 CheckMem();
 vd = vector<double>(1);
 CheckMem();
 return 0;
}

如果使用g(gcc版本4.8.4)进行编译,则会得到以下输出:

RSS: 1184 KB
RSS: 9128 KB
RSS: 9136 KB

当将向量重新分配为大小1时,似乎没有释放用于大向量(100万双〜8 MB)的内存.
但是,如果使用标志-std = c 11进行编译,则输出将更改:

RSS: 1180 KB
RSS: 9112 KB
RSS: 1300 KB

现在,该内存似乎已由重新分配释放. C 11标准是否以某种方式对内存进行重新分配?

解决方法:

该库的实现者很可能会重用向量的容量,只要它大于您为其分配的向量的容量即可.这样,他们可以节省内存分配.

从C 11开始,我们进行了移动分配,因此,当您使用-std = c 11进行编译时,而不是重新使用容量,则将临时矢量移动到现有矢量中,并将原始矢量的内容移动到临时中.在表达式的结尾,临时变量被销毁,您现在有了一个容量较小的向量.

如果要缩小向量的容量,则应检出:reduce the capacity of an stl vector

标签:c11,memory,vector,linux,c-4
来源: https://codeday.me/bug/20191119/2037200.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有