linux中内存泄漏的检测(一)最简单的方法_windmissing的博客-程序员资料_linux 程序怎么看内存泄漏

技术标签: 内存泄露  else  linux  

什么是内存泄漏

内存泄漏是指程序动态申请的内存在使用完后没有释放,导致这段内存不能被操作系统回收再利用。
例如这段程序,申请了4个字节的空间但没有释放,有4个字节的内存泄漏。

#include <iostream>
using namespace std;

int main()
{
     int *p = new int(1);
     cout <<*p<<endl;
     return 0
}

随着时间的推移,泄漏的内存越来越多,可用的内存越来越少,轻则性能受损,重则系统崩溃。

一般情况下,发生内存泄漏时,重启就可以回收泄漏的内存。但是对于linux,通常跑的是服务器程序,不可以随意重启,在内存泄漏问题上就要格外小心。

内存泄漏特点

  1. 难复现 — 要运行到足够长的时间才会暴露。

  2. 难定位 — 出错位置是随机的,看不出与内存泄漏的代码有什么联系。

最简单的方法

为了避免写出内存泄漏的程序,通常会有这样的编程规范,要求我们在写程序时申请和释放成对出现的。因为每一次申请都意味着必须有一次释放与它相对应。

基于这个特点,一种简单的方法就是在代码中统计申请和释放的次数,如果申请和释放的数量不同,就认为是内存泄漏了。

#include "stdio.h"
#include "stdlib.h"

int malloc_count, free_count;

void * my_malloc(int size)
{
     malloc_count++;
     return malloc(size);
}
void my_free(void *p)
{
     free_count++;
     free(p);
}
int main()
{
     count = 0;
     int *p1 = (int *)my_malloc(sizeif(int))
     int *p2 = (int *)my_malloc(sizeif(int))
     printf("%d, %d", p1, p2);
     my_free(p1);
     if(malloc_count != free_count)
         printf("memory leak!\n");
     return 0
}

方法分析

  • 优点:

直观,容易理解,容易实现

  • 缺点:

1.该方法要求运行结束时对运行中产生的打印分析才能知道结果。

2.该方法要求封装所有申请和释放空间的函数,并在调用的地方修改成调用封装后的函数。虽然C中申请/释放内存接口并不多,但是对于一个大型的项目,调用这些接口的地方却是很多的,要全部替换是一个比较大的工作量。

3.只对C语言适用,不能应用于C++

4.对于所调用的库不适用。如果希望应用于库,则要修改库代码

5.只能检测是否泄漏,却没有具体信息,比如泄漏了多少空间

6.不能说明是哪一行代码引起了泄漏

改进

这种方法虽然简单的,却有许多的不足,无法真正应用于项目中。欲知怎样改进,且看下回分解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mishifangxiangdefeng/article/details/50552687

智能推荐

MyBatis源码的学习(15)---sqlSession.selectList方法_itw_zhangzx02的博客-程序员资料_etsqlsession() .selectlist

sqlSession一共俩个实现类,我们这里分析默认的DefaultSqlSession类public &lt;E&gt; List&lt;E&gt; selectList(String statement, Object parameter, RowBounds rowBounds) { try { //ms对象代表我们的xml中的一条sql。例如:&lt;select...

最强Android教程!掌握这些Android开发热门前沿知识,赶紧收藏!_左夜天的博客-程序员资料_android 实用前沿技术

前言这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。欢迎一线公司员工以及网友提交面试题库,欢迎留言。网上的都是按照公司划分的,想找具体某一方面的知识点有点不好找,我这里就根据知识点分门别类的整理了一下,想看哪一块可以快速找到。阿里巴巴面试问题还记得一些,一部分已经忘记了,为了防止再忘记,所以写出来。1:你是如何理解Android操作系统的。2:是否熟悉framework层,如果熟

revit 转换ifc_导出 IFC 文件以使用 BIM 软件进行编辑_瑞士鲁迅的博客-程序员资料

内容在编辑 BIM IFC 文件之前,了解 Revit 导出设置。用户建筑师、工程师、设计师、项目经理、BIM 经理。方法1. 定义要导出的图元在 Revit 项目中,定义专用于导出 IFC 文件的三维视图。在此视图中,您可以控制对编辑文件的团队成员可见的图元。请勿包含编辑软件不支持的类别,例如 HVAC 图元。最好在协调模型中共享这些类别。2. 检查 IFC 导出映射文件选择“文件”&gt;“导...

linux系统实验shell程序设计,实验三-shell脚本程序设计_李苦李的博客-程序员资料

《实验三-shell脚本程序设计》由会员分享,可在线阅读,更多相关《实验三-shell脚本程序设计(10页珍藏版)》请在人人文库网上搜索。1、实 验 报 告课程名称 Linux系统实践 实验项目 LINUX SHELL脚本程序设计 实验仪器 PC 系 别 计算机学院 专 业 网络工程 班级/学号 网1702/2017011463 学生姓名 孟启贤 实验日期 4.15 成 绩 指导教师 李艳平 实验...

Best Practices for Speeding Up Your Web Site_longware_新浪博客_龙威的博客-程序员资料

Minimize HTTP RequestsUse a Content Delivery NetworkAdd an Expires or a Cache-Control HeaderGzip ComponentsPut Stylesheets at the TopPut Scripts at the BottomAvoid CSS Expre...

【安卓开发系列 -- APP】APP 性能优化 -- 启动优化_奋斗企鹅CopperSun的博客-程序员资料_应用启动性能优化

【安卓开发系列 -- APP】APP 性能优化 -- 启动优化【1】APP 启动优化的必要性原因 : 用户希望应用能够及时响应并快速加载,启动时间长的 APP 不能满足该期望;启动太慢的结果 : 体验效果差,用户流失,产品失败;【2】启动流程以及分类【2.1】开机启动流程注意,该流程图所示的启动过程为系统创建并启动应用的过程,一般不需要优化;【2.2】冷启动冷启动指应用从头开始启动,系统进程在冷启动后才创建应用进程,发生冷启动的情况包括应用自设备启动后或系统终止应用后.

随便推点

图形加速卡技术_小鱼人会飞的博客-程序员资料

转自:http://www.opengpu.org/bbs/forum.php?mod=viewthread&tid=4197前言:眼泪的多年收藏啊,这是篇相当好的文章。首先本文非常专业地道,当然,新手朋友们肯定会晕的,我看着都头大…… 不过其讲解的知识非常系统详细。基本上,显卡的所有基础知识都涵盖了,有兴趣的朋友可以仔细看看、学习一下。眼泪我也同样再复习复习。另外,这篇虽

Linux下的网络协议分析工具-tcpdump_weixin_34185320的博客-程序员资料

对于linux下网络通信数据包的分析,常常由于不像windows那样可视化,所以通常需要我们使用tcpdump抓取数据,然后在windows下使用wireshark来打开具体分析。TCPDUMP简介在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。对于网络管理人员来说,使...

PostMessage()_丫丫afc的博客-程序员资料

PostMessage函数PostMessage是WindowsAPI(应用程序接口)中的一个常用函数,用于将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。函数功能该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMess...

如何在Ubuntu中安装rpm包_This is bill的博客-程序员资料

原本是为了装flash player但是下载下来的是rpm的包, 所以有这个问题 解决方案Normally you install software or deb packages on Ubuntu/Mint linux via Synaptic, Ubuntu Software Center/ppa, or an apt-get command from the termina...

解决raise child_exception OSError: [Errno 2] No such file or directory的方法_DCGKCUF的博客-程序员资料_exception oserror: (2, 'no such file or directory'

如果你在执行python相关的程序时,出现如下的错误.....python2.5/subprocess.py", line 1079, in _execute_child     raise child_exception OSError: [Errno 2] No such file or directory那你就一定得检查与此相关的命令是否在你的$PATH路径下,如果不在,请一

一网打尽:贝佐斯与亚马逊时代_历史可以倒流的博客-程序员资料

全书主要描述了亚马逊从1995年刚开始成立时的一家网上书店到发展到现在成为集网上购物,云计算,Kindle业务的一家巨无霸的看似曲折却又似乎是必然的过程。说这个过程曲折,那是因为Amazon在每次想要逃脱外界定义的只是一家在网上卖书的店这个定义时,都不是一帆风顺的,无论是来自外界的阻力,还是内部的压力。而说他必然是因为贝佐斯这个整个亚马逊公司的大脑,一直在追求客户至上,扩张优先,把亚马逊是一家技术

推荐文章

热门文章

相关标签