文章目录

  • 一、内存泄漏定义
  • 二、内存泄漏的原因
  • 三、常见错误使用方法
  • 四、内存泄漏的分类

一、内存泄漏定义

内存泄漏,Memory Leak,指程序用动态存储分配函数动态开辟的空间,在使用完毕后未释放已申请的内存空间,结果导致一直占据该内存单元直到程序结束。一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存迟早会被占光

内存泄漏一般指的是堆内存的泄漏。堆内存是指程序从堆中分配的、大小任意的、可以在程序运行期决定内存大小的,使用完后必须显示的释放的内存。一般情况下,开发人员使用系统提供的内存管理基本函数,如 malloc 、 recalloc 、 calloc 、 free 等,从堆中完成动态存储变量存储空间的分配和释放,使用完后,程序必须负责相应的调用free或delete释放该内存块。否则,这块内存就不能被再次使用,这块内存泄露了。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了

二、内存泄漏的原因

从变量存在的时间生命周期的角度上,C语言把变量分为静态存储变量和动态存储变量两类

1、静态存储变量是指在程序运行期间分配了固定存储空间的变量
2、动态存储变量是指在程序运行期间根据实际需要进行动态地分配存储空间的变量

在内存中供用户使用的内存空间分为三部分:程序存储区、静态存储区、动态存储区

程序中所用的数据分别存放在静态存储区和动态存储区中

  1. 静态存储区数据在程序的开始就分配好内存区,在整个程序执行过程中它们所占的存储单元是固定的,在程序结束时就释放
  2. 动态存储区数据则是在程序执行过程中根据需要动态分配和动态释放的存储单元,有三类:函数形参、局部变量、函数调用的返回地址

三、常见错误使用方法

  1. 分配一个内存块并使用其中未经初始化的内容
  2. 释放一个内存块,但继续引用其中的内容
  3. 子函数中分配的内存空间在主函数出现异常中断时、或主函数对子函数返回的信息使用结束时,没有对分配的内存进行释放
  4. 程序实现过程中分配的临时内存在程序结束时,没有释放临时内存

四、内存泄漏的分类

  1. 常发性内存泄漏
    发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏

  2. 偶发性内存泄漏
    发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要

  3. 一次性内存泄漏
    发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次

  4. 隐式内存泄漏
    程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏

内存学习(三)内存泄露相关推荐

  1. 深入Golang内存管理(三) 内存对齐篇

    Go struct 内存对齐 举个例子 type S struct {a boolb int32c int8d int64e byte } 上面的struct S,占用多大的内存? 首先我们按照每个成 ...

  2. 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明

    目录 一.相关名词解释 垃圾收集常用名词 二.哪些地方需要回收 本地方法栈.虚拟机栈.程序计数器 方法区 Java堆 三.什么时候回收 1. 内存能否被回收 内存中的引用类型 引用计数算法 可达性分析 ...

  3. 内存泄露和溢出的区别_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子?...

    JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 内存泄漏 & 内存溢出 1. 内存泄漏(memory leak ) 申请了内存用完了不释放,比如一共有 1024M ...

  4. 一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer

    一位面试官询问我:Java中的JVM内存溢出和内存泄露是什么?我这么回答成功拿到了offer. 墨眉无锋墨家代码 2020-11-22 20:16:50 10525 收藏 56 分类专栏: Java ...

  5. python会不会出现内存泄露_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  6. ​Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

  7. connection timed out是什么意思_Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子...

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

  8. Android之内存泄露、内存溢出、内存抖动分析

      内存 JAVA是在JVM所虚拟出的内存环境中运行的,内存分为三个区:堆.栈和方法区. 栈(stack):是简单的数据结构,程序运行时系统自动分配,使用完毕后自动释放.优点:速度快. 堆(heap) ...

  9. CC++动态分配内存(手动分配内存)三种方式

    1. malloc函数 函数原型:void *malloc(unsigned int size) 函数的作用是:在内训的动态存储区开辟一个size个字节的连续空间,返回所分配区域的首字节地址.  可以 ...

最新文章

  1. python代码块-Python中的代码块和非代码块是什么
  2. 奇怪-正则匹配的test函数
  3. linux ls只显示文件名或者文件夹名
  4. 【opencv】10.播放视频 以及 设置任意键为暂停键
  5. 蓝桥杯 历届试题 合根植物(并查集)
  6. 如何正确执行碎片整理或在群集共享卷(CSV)上使用CHKDSK命令
  7. ICMP(Internet Control Message Protocol)网际控制报文协议初识
  8. 论文浅尝 - 计算机工程 | 大规模企业级知识图谱实践综述
  9. react的导出是怎么实现的_从零开始开发一个 React
  10. 大数据之-入门_Hadoop是什么---大数据之hadoop工作笔记0008
  11. 一步一步写算法(之非递归排序)
  12. 8数据提供什么掩膜产品_喜茶、茶百道、书亦、古茗8月外卖热销产品数据全解析...
  13. vector插入和删除操作
  14. 用python画分段函数图像_我想用Python matplotlib 画一个这样类似的图像,需要用到分段函数。大佬帮帮这个小弟?...
  15. 回调函数透彻理解Java
  16. 华东师范大学2019计算机与软件工程学院 “高可信”夏令营总结
  17. Stairway to T-SQL: Beyond The Basics Level 4: Using Views to Simplify Your Query - SQLServerCentral
  18. 精密电阻排行榜 List of Precision Resistors
  19. qq修改实名认证已达上限_王者荣耀实名认证系统,怎么二次修改
  20. TFN系列超声波探伤仪使用评价怎么样?好不好用?

热门文章

  1. java文件存储系统_分布式小文件存储系统
  2. html桌面插件,js桌面虚拟键盘插件A-Keyboard
  3. LiveQing云平台直播点播流媒体服务-产品介绍及相关资源
  4. 手机支付属于什么计算机应用领域,基于j2me的手机移动支付应用研究-计算机应用技术专业论文.docx...
  5. 四、地址空间与内存分配
  6. 【个人笔记】SIPp学习--正则表达式 三
  7. 【摸鱼吃瓜工作录】刚到公司,如何让项目经理对你刮目相看
  8. Android app反编译
  9. python自动排版公众号_自制微信公众号一键排版工具
  10. 将项目部署到云服务器上