范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Linux系统下如何检测内存泄露?

  01. 前言
  C/C++运行高效,不管是操作系统内核还是对性有要求的程序(比如游戏引擎)都要求使用C/C++来编写,其实C/C++强大的一点在于能够使用指针自由地控制内存的使用,适时的申请内存和释放内存,从而做到其他编程语言做不到的高效地运行。但是内存管理是一把双刃剑,用好了削铁如泥,用不好自断一臂。在申请堆上内存使用完之后中如果做不到适时有效的释放,那么就会造成内存泄露,久而久之程序就会将系统内存耗尽,导致系统运行出问题。就如同你每天跑去图书馆借一打书籍而不还,直到图书馆倒闭为止。
  C语言中申请内存和释放内存的方法是使用 malloc和free。
  C++中能兼容C,所以也能使用malloc和free,面向对象的情况下使用的则是new和delete,能够自动执行构造函数和析构函数。
  在Linux平台,我们可以使用valgrind命令检测C/C++程序是否内存泄露。
  02. valgrind安装
  debian/ubuntu下安装方法:
  deng@itcast:~$ sudo apt install valgrind
  deng@itcast:~$ sudo yum install valgrind
  安装好valgrind工具之后,下面来看看valgrind的几个应用场景。
  redhat/centos下安装方法:
  03. 使用未初始化的内存
  程序中我们定义了一个指针p,但并未给他分配空间,但我们却使用它了。
  程序示例:#include  #include  #include    int main(void) { char ch;      char *p;      ch = *p;      printf("ch = %c ", ch); return 0;  }
  valgrind检测出到我们的程序使用了未初始化的变量。
  04. 使用野指针
  p所指向的内存被释放了,p变成了野指针,但是我们却继续使用这片内存。
  程序示例:#include  #include  #include    int main(void) {      int *p = NULL;      p = malloc(sizeof(int)); if (NULL == p)     {   printf("malloc failed... "); return 1;     }        memset(p, 0, sizeof(int));      *p = 88;      printf("*p = %d ", *p); //释放内存      free(p);      printf("*p = %d ", *p); return 0;  }
  valgrind检测到我们使用了已经free的内存,并给出这片内存是哪里分配和哪里释放的。
  05. 动态内存越界访问
  我们动态地分配了一片连续的存储空间,但我们在访问个数组时发生了越界访问。
  程序示例:#include  #include  #include    int main(void) { int i = 0;      int *p = NULL;      p = malloc(5 * sizeof(int)); if (NULL == p)     {   printf("malloc failed... "); return 1;     }        memset(p, 0, 10 * sizeof(int)); for (int i = 0; i <= 5; i++)     {            p[i] = i + 1;       }   for (int i = 0; i <= 5; i++)     {   printf("p[%d]: %d ", i, p[i]);     }   return 0;  }
  valgrind检测出越界信息如下。
  注意:
  valgrind不检查非动态分配数组的使用情况
  06. 分配空间后没有释放
  内存泄漏的原因在于我们使用free或者new分配空间之后,没有使用free或者delete释放内存。
  程序示例:#include  #include   #include  int main(void) {      int *p = NULL;      p = malloc(sizeof(int));            *p = 88;      printf("*p = %d ", *p); return 0;  }
  valgrind的记录显示上面的程序用了1次malloc,却调用了0次free。
  可以使用--leak-check=full进一步获取内存泄漏的信息,比如malloc具体行号。
  07. 不匹配使用delete或者free
  一般我们使用malloc分配的空间,必须使用free释放内存。使用new分配的空间,使用delete释放内存。
  程序示例:#include  #include   #include  int main(void) {      int *p = NULL;      p = (int *)malloc(sizeof(int));       *p = 88;      printf("*p = %d ", *p);      delete p; return 0;  }
  不匹配地使用malloc/new/new[] 和 free/delete/delete[]则会被提示mismacth
  08. 两次释放同一块内存
  一般情况下,内存分配一次,只释放一次。如果多次释放,可能会出现double free。
  程序示例:#include  #include  #include    int main(void) {      int *p = NULL;      p = (int *)malloc(sizeof(int));      *p = 88;      printf("*p = %d ", *p); free p;   free p;  return 0;  }
  多次释放同一内存,出现非法释放内存。
  09. 总结
  内存泄露问题非常难定位,对于小工程项目来说,简单去检查代码中new和delete的匹配对数就基本能定位到问题,但是一旦代码量上升到以万单位时,仅靠肉眼检查来定位问题那就非常困难了,所以我们需要利用工具帮助我们找出问题所在。在Linux系统下内存检测工具首推Valgrind,一款非常好用的开源内存管理工具。Valgrind其实是一个工具集,内存错误检测只是它众多功能的一个,但我们用得最多的功能正是它——memcheck。推荐了解传智播客C++培训课程。
  总之,valgrind工具可以检测下列与内存相关的问题 :
  · 未释放内存的使用
  · 对释放后内存的读/写
  · 对已分配内存块尾部的读/写
  · 内存泄露
  · 不匹配的使用malloc/new/new[] 和 free/delete/delete[]
  · 重复释放内存

中国探测器登陆火星中国历史性第一次!5月15日,我国首次火星探测任务天问一号探测器在火星乌托邦平原南部预选着陆区着陆,在火星上首次留下中国印迹,迈出了我国星际探测征程的重要一步。这不是电影,不是科幻帮助NASA毅力号探测器登陆火星的机器人导航技术将探索深海地形相关导航帮助毅力号在火星上自主着陆,以及机智号火星无人机的飞行。现在是时候测试一个类似的系统,同时探索另一个前沿领域了。5月14日,美国国家海洋和大气管理局(NOAA)的Oke1纳米以下制程有了新突破半导体产业持续朝先进制程迈进,不断追求精密细小的极限挑战,以延续摩尔定律。为此,台湾地区台湾大学台积电美国麻省理工学院(MIT),联合研究发现二维材料结合半金属铋(Bi)能达到极低黑洞有没有可能是宇宙出口黑洞就是宇宙出口和地球一样你围绕地球走无论如何也走不出去最终只会回到原地但你往天空飞自然就脱离了地球看到地球是圆形宇宙也一样当你想知道宇宙边缘在哪时那可能是在朝一个错误方向前进也就马斯克吹逻辑很搞笑吹马斯克的人逻辑都很搞笑。比如中国,一个天上有太空站,火星上有登陆器的国家。他们觉得没有前途,啥子都没做,做的事情不是为了人类。然后把马斯克吹成,只有他在做宇宙探索一样。我不晓得他中国空间站系统总设计师被国际空间站拒之门外倒逼我们自主创新4月29日,中国空间站核心舱天和号发射升空,并顺利入轨,中国空间站建设的大幕就此开启。面对面栏目专访了航天科技集团五院载人航天工程空间站系统总设计师天和核心舱责任总设计师杨宏。中国我国或先于美国实现火星无人采样返回!但短期内移民火星不现实1964年,美国就向火星发射了探测器,但直到30多年后的1997年才成功在火星表面实现火星车软着陆,2004年才成功在火星软着陆重达180公斤的机遇号。我国呢?本想借助俄罗斯的力量美俄等多国航天机构祝贺天问一号成功着陆火星外交部由衷感谢5月17日,外交部发言人赵立坚主持例行记者会。有记者提问,中国首次火星探测任务天问一号探测器15日成功着陆火星,美国国家航空航天局副局长发推特表示祝贺,称期待此次任务为增进人类对火中国赢得全球火星竞赛的一席之地北京时间5月15日,中国首次火星探测任务天问一号探测器成功在火星预选着陆区乌托邦平原南部着陆,标志着中国首次火星探测任务着陆火星取得成功。对此,俄罗斯舆论给予了高度评价。俄罗斯商业中国的火星车是什么水平?5月15日早上,中国的首个火星着陆器在火星北半球的乌托邦平原南部成功实现软着陆。在火星表面进行的探测很快就要展开,而主要的探测工作就是由祝融号巡视器,俗称火星车进行。迄今为止,在火我们不再拥有太空!美参议员得知中国探测器成功着陆火星后感慨美国东部时间周五晚上,在中国火星探测器祝融号探测车成功降落在火星表面几小时后,美国国会参议员安格斯金表示,中国的这项成就使人们毫无疑问地相信中国是一个正在崛起的太空大国,它将对美国
你的微笑,是我心底永远的暖你的微笑是映入眼帘的是一朵娇艳是雨后炫目的阳光璀璨是果蔬飘香是天际蔚蓝是来自幽谷的溪流缓缓沁润我声声呼唤莫名喜欢你甜甜的笑颜眸光闪闪温柔了长久的期盼自从遇见了你不再寂寞孤单拭去眼角搭载华为海思麒麟(Kirin)710F荣耀20青春版说起华为大家都不陌生,华为旗下好几个品牌做手机,今天小编就给大家来讲讲搭载华为海思自研处理器芯片麒麟710F的荣耀20青春版这款手机。荣耀20青春版手机使用了华为海思自研处理器麒麟惠普星14青春版超薄笔记本电脑小编今天要说的这款去年3月份上市的惠普星14青春版笔记本电脑,这是一款比较轻薄便携的适合商务学生党使用的笔记本电脑,笔记本电脑整体机身重量1kg1。5kg左右。该笔记本电脑搭载第1星光不问赶路人,青春泣血,生命绽放光芒!任正非总裁办电子邮件电邮讲话2021006号签发人任正非星光不问赶路人任正非2021年01月22日克劳塞维茨在战争论中讲过伟大的将军们,是在茫茫黑暗中,把自己的心拿出来点燃,用微光照亮队五四青年节,致敬青春!!轰动全球的一篇短文青春千万不要动不动就说自己老了,错误引导自己!年轻就是力量,有梦就有未来!五四青年节,致敬青春!!德裔美籍人塞缪尔。厄尔曼70多年前写的一篇只有四百多字的短文。首次发表的时候,引起世界互联网本来就是青春饭追逐利润率最大化,这是职场铁定不变的规则,当平台想抛弃你的时候,甚至连声招呼都不打的。而这些大龄的失业者短时间内根本是不容易找到工作的。估计很多大龄应聘者都遇到这样的窘境。抱歉!这当我老了唯一心中藏有我的青春记忆多么希望,在远离红尘喧嚣的青山绿水旁,能和你有一座房子,不需要很大,屋后植果树,房前种花草,要有一扇窗子,我每天清晨,坐在窗前的阳光里写字,然后一抬头,便能看见窗外向我微笑的你,这青春的邂逅那一次的邂逅让我流连忘返那一次的美丽存留心间那一次的泪流婆娑涓涓绚丽的灯光下面裙裾飞扬,红男绿女的翩翩舞姿忽隐忽现,那一刻的流光溢彩总像是梦幻!惊诧之间一只小女轻撞了我一下,怒火之破吉尼斯纪录,狂赚1。68亿,李子柒让我看到了很真实的一幕网络时代,总少不了各种在网络上卖艺,以此来赚取流量的网红,最常见的是在网上直播,比如美食美妆等等。在众多网红中,美食主播李子染算是最成功的一位。和其他直播的喧闹相比,李子染视频里的健澜科技2015西湖论健国际高峰论坛AI改变医疗行业2015西湖论健国际高峰论坛2015西湖论健TM国际高峰论坛,于2015年10月16日17日在杭州黄龙饭店隆重举行。作为第十七届杭州西湖国际博览会中的开幕论坛,西湖论健TM就智慧医健澜科技让科技回归医疗本身2016西湖论健国际高峰论坛健澜科技让科技回归医疗本身2016西湖论健国际高峰论坛让科技回归医疗本身2016西湖论健国际高峰论坛2016WestLakeInternationalMedicalForum201