当前位置:首页 > > 嵌入式悦翔园
[导读]在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。

前言

今天在做项目的时候被发现有个指针变量的输出值总是莫名其妙,最后查清了原因发现是因为内存泄漏了!

有些小伙伴看到这就有点疑惑了,怎么内存还会泄漏呢?我只听过漏水、漏油,还没听过内存还会泄漏!

内存泄漏几乎是很难避免的,不管是老手还是新手,都存在这个问题,甚至 Windows 与 Linux 这类系统软件也或多或少存在着内存泄漏。

所以我还是那句话:不会用指针就不要用,不要你埋的雷让我来踩!

什么是内存泄漏

在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存

内存泄漏并非指内存在物理上的消失,而指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

在C中出现内存泄漏的主要原因就是程序猿在申请了内存后,没有及时释放没用的内存空间,甚至消灭了指针导致该区域内存空间根本无法释放

知道了出现内存泄漏的原因就能知道如何应对内存泄漏,即:不用了的内存空间记得释放,不释放留着过年哇!

内存泄漏的严重后果

要说内存泄漏的后果,那我就告诉你,内存泄漏会让你查程序查到怀疑人生,特别是对于新人来说,自己本来就对指针、内存这些东西不太熟悉,自己也不敢用,结果由于“大佬”的自信操作,造成你查起来真的非常非常费劲!

因为内存泄漏的堆积,最终消耗尽系统所有的内存。所以一次性内存泄漏并没有什么危害,因为一次性的内存泄漏并不会堆积。但是如果你遇到的是隐式内存泄漏的危害性则非常大,因为较之于常发性,偶发性内存泄漏它更难被检测到。

长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

内存泄漏有哪些现象

发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏,所以当你程序出现莫名其妙的问题时,记得想到这点。

另外内存泄漏还具有偶发性,发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅一块内存发生泄漏,同样会出现莫名其妙的问题,并且这种问题还不是每次都会发生,比上面的情况更加莫名其妙。

程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。

但是对于一个程序,可能需要运行几天、几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

如何避免内存泄漏

关于如何避免内存泄漏我总结了以下几点:

  • 在函数中看到有局部指针,就要警惕内存泄漏问题,养成进一步排查的习惯;

  • 在内存分配后别忘记使用 free 进行释放,alloca 函数除外;

  • 确保自己写的程序没有在访问空指针;

  • 每次分配内存之后都应该及时进行初始化,可以结合 memset 函数进行初始化,calloc 函数除外;

  • 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对;

  • 在对指针赋值前,一定要确保没有内存位置会变为孤立的;

  • 始终正确处理返回动态分配的内存引用的函数返回值;

结语

由于我是做汽车行业SOC开发的,所以内存泄漏真的很可怕,你想想你正在高速上开着车,结果由于内存泄漏,你的车载系统突然崩溃,你想想可怕不,刹车失灵,方向盘卡死!

所以汽车行业对于内存泄漏的要求是非常严格,会有专人review你写的代码,如果你申请完内存不释放,那你完了!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭