内存学习(三)内存泄露

一、内存泄漏定义

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

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

二、内存泄漏的原因

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

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

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

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

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

三、常见错误使用方法

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

四、内存泄漏的分类

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

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

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

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

猜你喜欢

转载自blog.csdn.net/future_sky_word/article/details/125830555
今日推荐