0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是內(nèi)存泄漏??jī)?nèi)存泄漏有哪些現(xiàn)象

工程師鄧生 ? 來源:嵌入式悅翔園 ? 作者:JamesBin ? 2022-09-05 17:24 ? 次閱讀

前言

今天在做項(xiàng)目的時(shí)候被發(fā)現(xiàn)有個(gè)指針變量的輸出值總是莫名其妙,最后查清了原因發(fā)現(xiàn)是因?yàn)?strong>內(nèi)存泄漏了!

有些小伙伴看到這就有點(diǎn)疑惑了,怎么內(nèi)存還會(huì)泄漏呢?我只聽過漏水、漏油,還沒聽過內(nèi)存還會(huì)泄漏!

內(nèi)存泄漏幾乎是很難避免的,不管是老手還是新手,都存在這個(gè)問題,甚至 Windows 與 Linux 這類系統(tǒng)軟件也或多或少存在著內(nèi)存泄漏。

所以我還是那句話:不會(huì)用指針就不要用,不要你埋的雷讓我來踩!

什么是內(nèi)存泄漏

在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。

內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而指程序中已動(dòng)態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費(fèi),導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果。

在C中出現(xiàn)內(nèi)存泄漏的主要原因就是程序猿在申請(qǐng)了內(nèi)存后,沒有及時(shí)釋放沒用的內(nèi)存空間,甚至消滅了指針導(dǎo)致該區(qū)域內(nèi)存空間根本無法釋放。

知道了出現(xiàn)內(nèi)存泄漏的原因就能知道如何應(yīng)對(duì)內(nèi)存泄漏,即:不用了的內(nèi)存空間記得釋放,不釋放留著過年哇!

內(nèi)存泄漏的嚴(yán)重后果

要說內(nèi)存泄漏的后果,那我就告訴你,內(nèi)存泄漏會(huì)讓你查程序查到懷疑人生,特別是對(duì)于新人來說,自己本來就對(duì)指針、內(nèi)存這些東西不太熟悉,自己也不敢用,結(jié)果由于“大佬”的自信操作,造成你查起來真的非常非常費(fèi)勁!

因?yàn)閮?nèi)存泄漏的堆積,最終消耗盡系統(tǒng)所有的內(nèi)存。所以一次性內(nèi)存泄漏并沒有什么危害,因?yàn)橐淮涡缘膬?nèi)存泄漏并不會(huì)堆積。但是如果你遇到的是隱式內(nèi)存泄漏的危害性則非常大,因?yàn)檩^之于常發(fā)性,偶發(fā)性內(nèi)存泄漏它更難被檢測(cè)到。

長(zhǎng)期運(yùn)行的程序出現(xiàn)內(nèi)存泄漏,影響很大,如操作系統(tǒng)、后臺(tái)服務(wù)等等,出現(xiàn)內(nèi)存泄漏會(huì)導(dǎo)致響應(yīng)越來越慢,最終卡死。

內(nèi)存泄漏有哪些現(xiàn)象

發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏,所以當(dāng)你程序出現(xiàn)莫名其妙的問題時(shí),記得想到這點(diǎn)。

另外內(nèi)存泄漏還具有偶發(fā)性,發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊且僅一塊內(nèi)存發(fā)生泄漏,同樣會(huì)出現(xiàn)莫名其妙的問題,并且這種問題還不是每次都會(huì)發(fā)生,比上面的情況更加莫名其妙。

程序在運(yùn)行過程中不停的分配內(nèi)存,但是直到結(jié)束的時(shí)候才釋放內(nèi)存。嚴(yán)格的說這里并沒有發(fā)生內(nèi)存泄漏,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存。

但是對(duì)于一個(gè)程序,可能需要運(yùn)行幾天、幾周甚至幾個(gè)月,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存。所以,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。

如何避免內(nèi)存泄漏

關(guān)于如何避免內(nèi)存泄漏我總結(jié)了以下幾點(diǎn):

在函數(shù)中看到有局部指針,就要警惕內(nèi)存泄漏問題,養(yǎng)成進(jìn)一步排查的習(xí)慣;

在內(nèi)存分配后別忘記使用 free 進(jìn)行釋放,alloca 函數(shù)除外;

確保自己寫的程序沒有在訪問空指針;

每次分配內(nèi)存之后都應(yīng)該及時(shí)進(jìn)行初始化,可以結(jié)合 memset 函數(shù)進(jìn)行初始化,calloc 函數(shù)除外;

每當(dāng)向指針寫入值時(shí),都要確保對(duì)可用字節(jié)數(shù)和所寫入的字節(jié)數(shù)進(jìn)行交叉核對(duì);

在對(duì)指針賦值前,一定要確保沒有內(nèi)存位置會(huì)變?yōu)楣铝⒌模?/p>

始終正確處理返回動(dòng)態(tài)分配的內(nèi)存引用的函數(shù)返回值;

結(jié)語(yǔ)

由于我是做汽車行業(yè)SOC開發(fā)的,所以內(nèi)存泄漏真的很可怕,你想想你正在高速上開著車,結(jié)果由于內(nèi)存泄漏,你的車載系統(tǒng)突然崩潰,你想想可怕不,剎車失靈,方向盤卡死!

所以汽車行業(yè)對(duì)于內(nèi)存泄漏的要求是非常嚴(yán)格,會(huì)有專人review你寫的代碼,如果你申請(qǐng)完內(nèi)存不釋放,那你完了!



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3503

    瀏覽量

    87877
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    587

    瀏覽量

    27177
  • 內(nèi)存泄漏
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    9185

原文標(biāo)題:我真的被C語(yǔ)言里的內(nèi)存泄漏整蒙了

文章出處:【微信號(hào):嵌入式悅翔園,微信公眾號(hào):嵌入式悅翔園】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何檢測(cè)內(nèi)存泄漏

    檢測(cè)內(nèi)存泄漏是軟件開發(fā)過程中一項(xiàng)至關(guān)重要的任務(wù),它有助于識(shí)別和解決那些導(dǎo)致程序占用過多內(nèi)存資源,從而影響程序性能甚至導(dǎo)致程序崩潰的問題。以下將詳細(xì)闡述幾種常見的內(nèi)存
    的頭像 發(fā)表于 07-30 11:50 ?442次閱讀

    NONOS 1.5.3/1.5.4 SSL內(nèi)存泄漏的原因?

    我已經(jīng)通過隨附的代碼驗(yàn)證了當(dāng)發(fā)生 SSL 握手錯(cuò)誤時(shí),會(huì)生成內(nèi)存泄漏 此外,espconn_reconnect_callback不稱為信令ESPCONN_HANDSHAKE - TCP SSL 握手
    發(fā)表于 07-18 07:24

    使用system_show_malloc()檢查內(nèi)存泄漏遇到異常怎么解決?

    我想使用system_show_malloc()檢查內(nèi)存泄漏,但是當(dāng)我調(diào)用該函數(shù)時(shí),我得到了致命的異常: 致命異常 28 (LoadProhibitedCause): epc1
    發(fā)表于 07-10 06:32

    C語(yǔ)言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時(shí)候才會(huì)出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因?yàn)闂?/div>
    發(fā)表于 03-19 11:38 ?387次閱讀
    C語(yǔ)言<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問題原理

    【鴻蒙】webview內(nèi)存泄漏問題的分析報(bào)告

    1 關(guān)鍵字 webview;內(nèi)存泄漏 2 問題描述 問題現(xiàn)象:在 3.1release 版本和 3.2bete1 版本中,在 RK3568 上使用 etsWeb 和其他瀏覽器時(shí),webview 所占
    的頭像 發(fā)表于 03-02 15:12 ?1958次閱讀

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案

    內(nèi)存溢出與內(nèi)存泄漏:定義、區(qū)別與解決方案? 內(nèi)存溢出和內(nèi)存泄漏是計(jì)算機(jī)科學(xué)中常見的問題,在開發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?1803次閱讀

    內(nèi)存泄漏什么影響

    用malloc申請(qǐng)的內(nèi)存,沒有釋放,為什么程序也不會(huì)出錯(cuò)?
    的頭像 發(fā)表于 12-07 09:42 ?528次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b><b class='flag-5'>有</b>什么影響

    全志R128內(nèi)存泄漏調(diào)試案例

    ,音樂停止播放,報(bào)錯(cuò)如下: 問題分析 根據(jù)上面報(bào)錯(cuò)的log,播放停止時(shí),系統(tǒng)內(nèi)存不足;在老化過程中出現(xiàn)的內(nèi)存不足,一般是某處存在內(nèi)存泄漏 reboot重啟,重新執(zhí)行老化播放流程,串口
    發(fā)表于 11-20 16:54

    如何發(fā)現(xiàn)內(nèi)存泄漏

    檢測(cè)兩個(gè)角度介紹在 Linux 環(huán)境進(jìn)行內(nèi)存泄漏檢測(cè)的方法,并重點(diǎn)介紹靜態(tài)分析工具 BEAM、動(dòng)態(tài)監(jiān)測(cè)工具 Valgrind 和 rational purify 的使用方法。相信通過本文的介紹,能給大家對(duì)處理其它產(chǎn)品或項(xiàng)目內(nèi)存
    的頭像 發(fā)表于 11-13 15:41 ?484次閱讀

    線程內(nèi)存泄漏問題的定位

    記錄一個(gè)關(guān)于線程內(nèi)存泄漏問題的定位過程,以及過程中的收獲。 1. 初步定位 是否存在內(nèi)存泄漏:想到內(nèi)存
    的頭像 發(fā)表于 11-13 11:38 ?508次閱讀
    線程<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問題的定位

    如何寫一個(gè)內(nèi)存泄漏檢測(cè)工具

    如何確定有內(nèi)存泄露問題,如何定位到內(nèi)存泄露位置,如何寫一個(gè)內(nèi)存泄漏檢測(cè)工具? 1:概述 內(nèi)存泄露本質(zhì):其實(shí)就是申請(qǐng)調(diào)用malloc/new,
    的頭像 發(fā)表于 11-11 16:19 ?708次閱讀

    內(nèi)存泄漏會(huì)產(chǎn)生哪些后果

    內(nèi)存泄漏原因 內(nèi)存泄漏在C/C++這種不帶GC(Garbage Collection)的語(yǔ)言里,是一個(gè)經(jīng)常發(fā)生的問題。因?yàn)闆]有GC,所以分配的內(nèi)存
    的頭像 發(fā)表于 11-10 15:06 ?674次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>會(huì)產(chǎn)生哪些后果

    內(nèi)存泄漏如何避免

    的數(shù),那就是內(nèi)存溢出。 2. 內(nèi)存泄漏 內(nèi)存泄露 memory leak,是指程序在申請(qǐng)內(nèi)存后,無法釋放已申請(qǐng)的
    的頭像 發(fā)表于 11-10 11:04 ?592次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>如何避免

    Linux C/C++編程中的內(nèi)存泄漏問題

    ,需要對(duì)各種編程語(yǔ)言和技術(shù)深入的理解。而C++,作為一種高性能的編程語(yǔ)言,在許多領(lǐng)域(如網(wǎng)絡(luò)編程、嵌入式系統(tǒng)、音視頻處理等)都發(fā)揮著不可忽視的作用。然而,許多C++程序員在編程過程中,尤其是在進(jìn)行復(fù)雜的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)時(shí),可能會(huì)遇到一些棘手的問題,如內(nèi)存
    的頭像 發(fā)表于 11-09 10:11 ?772次閱讀
    Linux C/C++編程中的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>問題

    什么是內(nèi)存泄漏?如何避免JavaScript內(nèi)存泄漏

    JavaScript 代碼中常見的內(nèi)存泄漏的常見來源: 研究內(nèi)存泄漏問題就相當(dāng)于尋找符合垃圾回收機(jī)制的編程方式,有效避免對(duì)象引用的問題。
    發(fā)表于 10-27 11:30 ?273次閱讀
    什么是<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>?如何避免JavaScript<b class='flag-5'>內(nèi)存</b><b class='flag-5'>泄漏</b>