<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

什么是堆內存?存儲方式是什么樣的?

科技綠洲 ? 來源:單片機與嵌入式 ? 作者:單片機與嵌入式 ? 2023-06-22 10:29 ? 次閱讀

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

什么是堆內存?存儲方式是什么樣的呢?

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

圖片

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

如何獲取堆內存?

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

方法一:把函數返回值直接賦值給指針,一般表現形式如下:

圖片

方法二:將指針地址作為函數返回參數,通過返回參數保存堆內存地址,一般表現形式如下:

圖片

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

內存泄漏的三個原因

當我們的代碼出現內存泄漏的時候,一般都會包含以下幾個原因:
  • 函數內有局部指針變量定義
  • 對該局部指針有獲取內存的操作
  • 在函數返回前沒有釋放該內存,也未保存到其他全局變量或返回上一級函數

如何檢查內存泄漏

為了避免檢查內存泄漏,我們還是要養成良好的編碼習慣。當我們要進行檢查內存泄漏問題的時候,一般要做到以下三點:
  • 當我們在函數中看到有局部指針的時候,一定要仔細檢查是否有存泄漏的問題發生,養成仔細檢查的習慣
  • 如果有局部變量,并且有對局部變量賦值的操作,要檢查函數的返回的指針到底是指向什么?是全局變量、靜態數據還是堆內存?如果代碼中有不熟悉的接口,要找到對應接口文檔或源代碼分析,保證不要出現不必要的錯誤
  • 如果函數中有對局部指針有內存申請的操作,那么要檢查被保存的是全局變量嗎?會被作為函數返回值嗎?如果都不是的話,那要排查函數所有的“return”的地方,要保證內存被正確釋放,不占用內存
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    12

    文章

    3912

    瀏覽量

    84884
  • 內存
    +關注

    關注

    8

    文章

    2794

    瀏覽量

    73037
  • 函數
    +關注

    關注

    3

    文章

    4117

    瀏覽量

    61507
收藏 人收藏

    評論

    相關推薦

    內存管理(中)

    內存管理(中) 歡迎研究ZigBee的朋友和我交流。。。
    發表于 08-11 19:16

    電腦電源怎么啊,什么樣的最好?

    電腦電源怎么啊,什么樣的最好?
    發表于 01-15 17:17

    電腦電源怎么啊,什么樣的最好?

    電腦電源怎么啊,什么樣的最好?
    發表于 01-16 10:34

    內存管理實例中運行Test函數會有什么樣的結果

    ); strcpy(str, "helloworld"); printf(str);}運行Test函數會有什么樣的結果?答: 程序崩潰;原因:1、實參是通過拷貝的方式 傳遞給行參
    發表于 01-22 16:15

    面向列的HBase存儲結構究竟有什么樣的不同之處呢?

    HBase是什么?HBase的存儲結構究竟是怎樣的呢?面向列的HBase存儲結構究竟有什么樣的不同之處呢?
    發表于 06-16 06:52

    【原創】內存的那些事

    區域那樣有明顯的分界線。內存的釋放看下面這個圖:看到這樣頻繁的使用區域和釋放,那么很容易看出內存是不連續的,跟
    發表于 07-12 09:48

    和棧的區別是什么

    在回答完進程的虛擬地址空間布局之后(上一篇),面試官可能抓住和棧深入展開。和棧的區別①管理方式:棧由編譯器自動管理;由程序員控制,使用方便,但易產生
    發表于 12-22 07:26

    Freertos關于內存管理的相關資料分享

    內存管理Malloc、Free防止內存碎片Freertos
    發表于 12-27 08:12

    STM32棧區劃分

    STM32棧區(一)一個由C/C++編譯的程序占用的內存分為以下幾個部分:棧區(stack):編譯器自動分配釋放,存放函數的參數值,局部變量的值等。操作方式類似于數據結構中的棧。
    發表于 01-20 08:32

    stm32和棧的相關資料推薦

    關于和棧已經是程序員的一個月經話題,大部分有是基于os層來聊的。那么,在赤裸裸的單片機下的和棧是什么樣的分布呢?以下是網摘:剛接手STM32時,你只編寫一個int main(){while(1
    發表于 01-25 06:54

    單片機下的和棧是什么樣的分布呢?

    是基于os層來聊的。那么,在赤裸裸的單片機下的和棧是什么樣的分布呢?以下是網摘:剛接手STM32時,你只編寫一個int main(){while(1);}BUILD://Prog...
    發表于 01-25 07:07

    ESP8266上的內存類型有多少?

    arduino 草圖時,我使用什么樣內存?如果我存儲一些非易變的東西但程序在哪里運行,我可以使用 SPIFFS?在公羊?我有多少內存?
    發表于 02-24 06:34

    對于VPP硬件不支持的YUV格式轉換,采取什么樣的軟件方式最快?

    對于VPP硬件不支持的YUV格式轉換,采取什么樣的軟件方式最快?
    發表于 09-18 07:54

    5G給內存存儲帶來了什么樣的發展美光科技的解答

     內存存儲的區別越來越模糊,在2021年,將看到企業正在尋求新型解決方案,例如存儲內存內存虛擬化,以進一步釋放AI及激增的數據量帶來的
    的頭像 發表于 01-17 10:34 ?2833次閱讀

    簡述C語言中的內存泄漏的原理及解決方法

    內存泄漏的原理 只有在堆內存里面才會發生內存泄漏的問題,在棧內存中不會發生內存泄漏。因為棧內存
    的頭像 發表于 06-29 14:58 ?6970次閱讀
    簡述C語言中的<b class='flag-5'>內存</b>泄漏的原理及解決方法
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>