0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是内存泄漏?内存泄漏有哪些现象

工程师邓生 来源:嵌入式悦翔园 作者:JamesBin 2022-09-05 17:24 次阅读

前言

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

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

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

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

什么是内存泄漏

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

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

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

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

内存泄漏的严重后果

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

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

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

内存泄漏有哪些现象

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

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

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

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

如何避免内存泄漏

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

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

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

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

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

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

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

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

结语

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

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



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3540

    浏览量

    88595
  • Linux系统
    +关注

    关注

    4

    文章

    593

    浏览量

    27387
  • 内存泄漏
    +关注

    关注

    0

    文章

    39

    浏览量

    9211

原文标题:我真的被C语言里的内存泄漏整蒙了

文章出处:【微信号:嵌入式悦翔园,微信公众号:嵌入式悦翔园】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    虚拟内存溢出该怎么处理 虚拟内存在服务器中的应用

    、虚拟内存溢出的原因 内存泄漏 :程序中未正确释放的内存会导致内存泄漏,随着时间的推移,这些
    的头像 发表于 12-04 09:49 128次阅读

    什么是泄漏电流试验?

    泄漏电流的概念泄漏电流(leakagecurrent)也叫接触电流,是指在没有故障施加电压的情况下,电气中相互绝缘的金属零件之间,或带电零件与接地零件之间,通过其周围介质或绝缘表面所形成的电流。泄漏
    的头像 发表于 11-26 11:48 196次阅读
    什么是<b class='flag-5'>泄漏</b>电流试验?

    堆栈和内存的基本知识

    本文主要聊聊关于堆栈的内容。包括堆栈和内存的基本知识。常见和堆栈相关的 bug,如栈溢出,内存泄漏,堆内存分配失败等。后面介绍软件中堆栈统计的重要性,以及如何使用工具工具软件中堆栈使用
    的头像 发表于 08-29 14:10 432次阅读
    堆栈和<b class='flag-5'>内存</b>的基本知识

    如何检测内存泄漏

    检测内存泄漏是软件开发过程中一项至关重要的任务,它有助于识别和解决那些导致程序占用过多内存资源,从而影响程序性能甚至导致程序崩溃的问题。以下将详细阐述几种常见的内存
    的头像 发表于 07-30 11:50 1758次阅读

    NONOS 1.5.3/1.5.4 SSL内存泄漏的原因?

    我已经通过随附的代码验证了当发生 SSL 握手错误时,会生成内存泄漏 此外,espconn_reconnect_callback不称为信令ESPCONN_HANDSHAKE - TCP SSL 握手
    发表于 07-18 07:24

    使用system_show_malloc()检查内存泄漏遇到异常怎么解决?

    我想使用system_show_malloc()检查内存泄漏,但是当我调用该函数时,我得到了致命的异常: 致命异常 28 (LoadProhibitedCause): epc1
    发表于 07-10 06:32

    在CONSOLE中输入tasks,help等指令后,调用free查看剩余内存发现递减,为什么?

    在CONSOLE中输入tasks,help等指令后,调用free查看剩余内存发现递减。 而free指令本身不会造成内存泄漏
    发表于 06-26 07:17

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈
    发表于 03-19 11:38 518次阅读
    C语言<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>问题原理

    煤气柜泄漏问题如何解决

    电子发烧友网站提供《煤气柜泄漏问题如何解决.docx》资料免费下载
    发表于 03-05 17:49 0次下载

    【鸿蒙】webview内存泄漏问题的分析报告

    1 关键字 webview;内存泄漏 2 问题描述 问题现象:在 3.1release 版本和 3.2bete1 版本中,在 RK3568 上使用 etsWeb 和其他浏览器时,webview 所占
    的头像 发表于 03-02 15:12 2137次阅读

    什么是内存泄漏?android中导致内存泄漏的主要几个点

    当一个对象已经不需要在使用了,本应该被回收,而另一个正在使用的对象持有它的引用,导致对象不能被回收。
    的头像 发表于 02-20 10:17 580次阅读
    什么是<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>?android中导致<b class='flag-5'>内存</b><b class='flag-5'>泄漏</b>的主要几个点

    变压器如何减小泄漏感应呢?

    变压器如何减小泄漏感应呢? 变压器是一种用来改变交流电压的重要设备。在变压器中,存在着一种称为泄漏感应的现象泄漏感应是指变压器在工作过程中,由于磁场的存在产生的感应电动势,但是这部分
    的头像 发表于 01-30 17:04 1284次阅读

    什么是气密性泄漏设备

    气密性泄漏设备是指用于检测气体或液体密封性能的设备,其工作原理是通过检测设备内部压力的变化来判断密封是否完好。这种设备广泛应用于航空航天、石油化工、电力等领域,用于检测各种管道、阀门、压力容器等设备
    的头像 发表于 01-19 11:34 655次阅读
    什么是气密性<b class='flag-5'>泄漏</b>设备

    直流泄漏和直流耐压 直流耐压为什么采用负极性

    直流泄漏和直流耐压 直流耐压为什么采用负极性  直流泄漏和直流耐压是电力行业中的两个重要概念,它们在电力设备的设计、安装和维护中起着至关重要的作用。直流泄漏指的是直流电系统中的电流泄漏
    的头像 发表于 12-29 11:03 952次阅读

    内存溢出与内存泄漏:定义、区别与解决方案

    内存溢出与内存泄漏:定义、区别与解决方案  内存溢出和内存泄漏是计算机科学中常见的问题,在开发和
    的头像 发表于 12-19 14:10 2699次阅读