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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

簡述C語言中的內(nèi)存泄漏的原理及解決方法

Q4MP_gh_c472c21 ? 來源:金橙智能 ? 作者:金橙智能 ? 2021-06-29 14:58 ? 次閱讀

內(nèi)存泄漏的原理

只有在堆內(nèi)存里面才會發(fā)生內(nèi)存泄漏的問題,在棧內(nèi)存中不會發(fā)生內(nèi)存泄漏。因為棧內(nèi)存在自動分配空間之后,還會自動釋放空間。

什么是堆內(nèi)存?存儲方式是什么樣的呢?

首先我們先來介紹一下堆內(nèi)存在C代碼中的存儲方式。C代碼中動態(tài)申請堆內(nèi)存的申請函數(shù)是malloc,常見的內(nèi)存代碼如下圖所示:

d6d6bf80-d8a6-11eb-9e57-12bb97331649.png

因為malloc函數(shù)返回值是一個內(nèi)存地址,所以保存堆內(nèi)存的變量一定得是一個指針,當然這個變量可以是一個單指針,也可以是一個多重指針。

如何獲取堆內(nèi)存?

對于堆內(nèi)存的獲取方法,我們可以有兩種方法,第一種是用返回值傳遞內(nèi)存指針,第二種方法是通過參數(shù)傳遞給內(nèi)存指針。上面我們用到的malloc申請內(nèi)存,就是屬于方法一的一種具體表現(xiàn)形式,是直接把返回值傳遞給內(nèi)存指針。

方法一:把函數(shù)返回值直接賦值給指針,一般表現(xiàn)形式如下:

d6e7fce6-d8a6-11eb-9e57-12bb97331649.png

方法二:將指針地址作為函數(shù)返回參數(shù),通過返回參數(shù)保存堆內(nèi)存地址,一般表現(xiàn)形式如下:

d6f30ea6-d8a6-11eb-9e57-12bb97331649.png

總結:這兩類方法的本質(zhì)是一樣的,都是函數(shù)內(nèi)存間接申請了內(nèi)存,但是只有傳遞內(nèi)存的方法不一樣,方法一是通過返回值傳遞內(nèi)存指針,方法二是通過參數(shù)傳遞內(nèi)存指針。

內(nèi)存泄漏的三個原因

當我們的代碼出現(xiàn)內(nèi)存泄漏的時候,一般都會包含以下幾個原因:1、函數(shù)內(nèi)有局部指針變量定義;2、對該局部指針有獲取內(nèi)存的操作;3、在函數(shù)返回前沒有釋放該內(nèi)存,也未保存到其他全局變量或返回上一級函數(shù)。

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

為了避免檢查內(nèi)存泄漏,我們還是要養(yǎng)成良好的編碼習慣。當我們要進行檢查內(nèi)存泄漏問題的時候,一般要做到以下三點:

(1)當我們在函數(shù)中看到有局部指針的時候,一定要仔細檢查是否有存泄漏的問題發(fā)生,養(yǎng)成仔細檢查的習慣;

(2)如果有局部變量,并且有對局部變量賦值的操作,要檢查函數(shù)的返回的指針到底是指向什么?是全局變量、靜態(tài)數(shù)據(jù)還是堆內(nèi)存?如果代碼中有不熟悉的接口,要找到對應接口文檔或源代碼分析,保證不要出現(xiàn)不必要的錯誤;

(3)如果函數(shù)中有對局部指針有內(nèi)存申請的操作,那么要檢查被保存的是全局變量嗎?會被作為函數(shù)返回值嗎?如果都不是的話,那要排查函數(shù)所有的“return”的地方,要保證內(nèi)存被正確釋放,不占用內(nèi)存。

編輯:jq

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

    關注

    3

    文章

    4344

    瀏覽量

    62813
  • 代碼
    +關注

    關注

    30

    文章

    4810

    瀏覽量

    68827
  • C代碼
    +關注

    關注

    1

    文章

    89

    瀏覽量

    14325

原文標題:一篇文章幫你解決C語言中的內(nèi)存泄漏問題

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    EE-62:在C語言中訪問短字內(nèi)存

    電子發(fā)燒友網(wǎng)站提供《EE-62:在C語言中訪問短字內(nèi)存.pdf》資料免費下載
    發(fā)表于 01-07 14:02 ?0次下載
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>語言中</b>訪問短字<b class='flag-5'>內(nèi)存</b>

    EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù).pdf》資料免費下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的DSP:從<b class='flag-5'>C</b>調(diào)用匯編類成員函數(shù)

    C語言中申請的堆內(nèi)存能不能自動釋放

    C語言中申請的堆內(nèi)存能不能自動釋放?每次都要手動 free 太麻煩,也容易忘記。 學過 C++ 的同學,應該首先能想到智能指針。 但是這是C
    的頭像 發(fā)表于 11-27 09:33 ?150次閱讀

    RAM內(nèi)存不足的表現(xiàn)及解決方法

    RAM內(nèi)存不足的表現(xiàn)及解決方法 一、RAM內(nèi)存不足的表現(xiàn) 系統(tǒng)運行緩慢 當RAM內(nèi)存不足時,計算機的響應速度會明顯下降,打開程序或文件需要更長的時間。 頻繁的頁面交換(Page Swa
    的頭像 發(fā)表于 11-11 09:53 ?1484次閱讀

    技術干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應用

    語句和條件運算符。這些結構不僅增強了代碼的靈活性,還提高了程序的可讀性和可維護性。本文將深入探討C語言中的主要條件判斷語句,包括它們的語法、使用方法及實際應用,通過
    的頭像 發(fā)表于 11-09 01:10 ?400次閱讀
    技術干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:掌握<b class='flag-5'>C</b><b class='flag-5'>語言</b>條件判斷,從if到switch的應用

    C語言中的socket編程基礎

    Socket編程簡介 Socket是一種通信機制,允許程序之間進行通信。在C語言中,socket編程是網(wǎng)絡編程的基礎。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),實現(xiàn)不同計算機之間的通信
    的頭像 發(fā)表于 11-01 16:51 ?392次閱讀

    c語言中從左到右結合怎么看

    C語言中,操作符的結合性(Associativity)是指當操作符在表達式中連續(xù)出現(xiàn)時,它們?nèi)绾闻c操作數(shù)結合的順序。對于大多數(shù)二元操作符(即需要兩個操作數(shù)的操作符),C語言遵循兩種基
    的頭像 發(fā)表于 08-20 11:42 ?1000次閱讀

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

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

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

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

    嵌入式系統(tǒng)中C語言結構體的基礎實現(xiàn)與應用

    C語言中的數(shù)組只能允許程序員定義存儲相同類型數(shù)據(jù)。但是結構是C語言編程中允許您存儲不同數(shù)據(jù)類型的數(shù)據(jù)。
    發(fā)表于 03-12 14:29 ?534次閱讀
    嵌入式系統(tǒng)中<b class='flag-5'>C</b><b class='flag-5'>語言</b>結構體的基礎實現(xiàn)與應用

    C語言中的typedef的應用

    C 語言提供了 typedef 關鍵字,您可以使用它來為類型取一個新的名字。下面的實例為單字節(jié)數(shù)字定義了一個術語 BYTE。
    發(fā)表于 03-06 11:34 ?422次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的typedef的應用

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

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

    介紹C語言中錯誤處理和異常處理的一些常用的方法和策略

    C語言是一種低級的、靜態(tài)的、結構化的編程語言,它沒有提供像C++或Java等高級語言中的異常處理機制,例如try-catch-finally
    的頭像 發(fā)表于 02-28 14:25 ?649次閱讀

    C語言中的動態(tài)內(nèi)存管理講解

    本章將講解 C 中的動態(tài)內(nèi)存管理。C 語言內(nèi)存的分配和管理提供了幾個函數(shù)。這些函數(shù)可以在 頭文件中找到。
    的頭像 發(fā)表于 02-23 14:03 ?412次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的動態(tài)<b class='flag-5'>內(nèi)存</b>管理講解

    枚舉有多大?c語言枚舉end的作用是什么?

    枚舉有多大?c語言枚舉end的作用是什么? 枚舉在C語言中是一種常見的數(shù)據(jù)類型,用于定義一組相互關聯(lián)的常量或者變量。它通常用于表示一系列可能的取值,使得程序更加易讀和易維護。在
    的頭像 發(fā)表于 01-19 14:19 ?645次閱讀