0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

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

科技綠洲 ? 來(lái)源:?jiǎn)纹瑱C(jī)與嵌入式 ? 作者:?jiǎn)纹瑱C(jī)與嵌入式 ? 2023-06-22 10:29 ? 次閱讀

只有在堆內(nèi)存里面才會(huì)發(fā)生內(nèi)存泄漏的問(wèn)題,在棧內(nèi)存中不會(huì)發(fā)生內(nèi)存泄漏。因?yàn)闂?nèi)存在自動(dòng)分配空間之后,還會(huì)自動(dòng)釋放空間。

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

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

圖片

因?yàn)閙alloc函數(shù)返回值是一個(gè)內(nèi)存地址,所以保存堆內(nèi)存的變量一定得是一個(gè)指針,當(dāng)然這個(gè)變量可以是一個(gè)單指針,也可以是一個(gè)多重指針。

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

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

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

圖片

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

圖片

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

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

當(dāng)我們的代碼出現(xiàn)內(nèi)存泄漏的時(shí)候,一般都會(huì)包含以下幾個(gè)原因:
  • 函數(shù)內(nèi)有局部指針變量定義
  • 對(duì)該局部指針有獲取內(nèi)存的操作
  • 在函數(shù)返回前沒(méi)有釋放該內(nèi)存,也未保存到其他全局變量或返回上一級(jí)函數(shù)

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

為了避免檢查內(nèi)存泄漏,我們還是要養(yǎng)成良好的編碼習(xí)慣。當(dāng)我們要進(jìn)行檢查內(nèi)存泄漏問(wèn)題的時(shí)候,一般要做到以下三點(diǎn):
  • 當(dāng)我們?cè)诤瘮?shù)中看到有局部指針的時(shí)候,一定要仔細(xì)檢查是否有存泄漏的問(wèn)題發(fā)生,養(yǎng)成仔細(xì)檢查的習(xí)慣
  • 如果有局部變量,并且有對(duì)局部變量賦值的操作,要檢查函數(shù)的返回的指針到底是指向什么?是全局變量、靜態(tài)數(shù)據(jù)還是堆內(nèi)存?如果代碼中有不熟悉的接口,要找到對(duì)應(yīng)接口文檔或源代碼分析,保證不要出現(xiàn)不必要的錯(cuò)誤
  • 如果函數(shù)中有對(duì)局部指針有內(nèi)存申請(qǐng)的操作,那么要檢查被保存的是全局變量嗎?會(huì)被作為函數(shù)返回值嗎?如果都不是的話,那要排查函數(shù)所有的“return”的地方,要保證內(nèi)存被正確釋放,不占用內(nèi)存
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4510

    瀏覽量

    87178
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3115

    瀏覽量

    75073
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4374

    瀏覽量

    64423
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    堆棧內(nèi)存內(nèi)存之間的區(qū)別

    編寫(xiě)有效的代碼需要了解堆棧和內(nèi)存,這使其成為學(xué)習(xí)編程的重要組成部分。不僅如此,新程序員或職場(chǎng)老手都應(yīng)該完全熟悉堆棧內(nèi)存內(nèi)存之間的區(qū)別,
    發(fā)表于 08-07 12:23 ?903次閱讀
    堆棧<b class='flag-5'>內(nèi)存</b>和<b class='flag-5'>堆</b><b class='flag-5'>內(nèi)存</b>之間的區(qū)別

    內(nèi)存管理實(shí)例中運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果

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

    【原創(chuàng)】內(nèi)存的那些事

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

    和棧的區(qū)別是什么

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

    單片機(jī)下的和棧是什么樣的分布呢?

    是基于os層來(lái)聊的。那么,在赤裸裸的單片機(jī)下的和棧是什么樣的分布呢?以下是網(wǎng)摘:剛接手STM32時(shí),你只編寫(xiě)一個(gè)int main(){while(1);}BUILD://Prog...
    發(fā)表于 01-25 07:07

    ESP8266上的內(nèi)存類型有多少?

    arduino 草圖時(shí),我使用什么樣內(nèi)存?如果我存儲(chǔ)一些非易變的東西但程序在哪里運(yùn)行,我可以使用 SPIFFS?在公羊?我有多少內(nèi)存
    發(fā)表于 02-24 06:34

    什么樣的冰箱沒(méi)有霜

    什么樣的冰箱沒(méi)有霜 什么樣的冰箱比較容易結(jié)霜,什么樣的冰箱在這方面就會(huì)好些?使用中要注意哪些問(wèn)題呢?   風(fēng)冷冰箱不易結(jié)霜
    發(fā)表于 02-21 17:56 ?2127次閱讀

    未來(lái)存儲(chǔ)技術(shù)的發(fā)展是什么樣

    未來(lái)的存儲(chǔ)技術(shù)會(huì)是什么樣子呢?對(duì)于基于NVMe的傳統(tǒng)Flash技術(shù),我們應(yīng)該繼續(xù)期望更高的容量。
    發(fā)表于 09-18 14:39 ?1459次閱讀

    5G給內(nèi)存存儲(chǔ)帶來(lái)了什么樣的發(fā)展美光科技的解答

     內(nèi)存存儲(chǔ)的區(qū)別越來(lái)越模糊,在2021年,將看到企業(yè)正在尋求新型解決方案,例如存儲(chǔ)級(jí)內(nèi)存內(nèi)存虛擬化,以進(jìn)一步釋放AI及激增的數(shù)據(jù)量帶來(lái)的
    的頭像 發(fā)表于 01-17 10:34 ?3206次閱讀

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

    內(nèi)存泄漏的原理 只有在內(nèi)存里面才會(huì)發(fā)生內(nèi)存泄漏的問(wèn)題,在棧內(nèi)存中不會(huì)發(fā)生內(nèi)存泄漏。因?yàn)闂?/div>
    的頭像 發(fā)表于 06-29 14:58 ?7531次閱讀
    簡(jiǎn)述C語(yǔ)言中的<b class='flag-5'>內(nèi)存</b>泄漏的原理及解決方法

    什么是內(nèi)存?內(nèi)存是如何分配的?

    在一般的編譯系統(tǒng)中,內(nèi)存的分配方向和棧內(nèi)存是相反的。當(dāng)棧內(nèi)存從高地址向低地址增長(zhǎng)的時(shí)候,內(nèi)存
    的頭像 發(fā)表于 07-05 17:58 ?1w次閱讀

    程序內(nèi)存分區(qū)中的與棧

    與棧表示兩種內(nèi)存管理方式; (2)數(shù)據(jù)結(jié)構(gòu)場(chǎng)景下,與棧表示兩種常用的數(shù)據(jù)結(jié)構(gòu)。 1.程序內(nèi)存分區(qū)中的與棧 1.1 棧簡(jiǎn)介 棧由操作系統(tǒng)自
    的頭像 發(fā)表于 11-11 16:21 ?1140次閱讀
    程序<b class='flag-5'>內(nèi)存</b>分區(qū)中的<b class='flag-5'>堆</b>與棧

    malloc 申請(qǐng)內(nèi)存的兩種方式

    我們知道m(xù)alloc() 并不是系統(tǒng)調(diào)用,也不是運(yùn)算符,而是 C 庫(kù)里的函數(shù),用于動(dòng)態(tài)分配內(nèi)存。 malloc 申請(qǐng)內(nèi)存的時(shí)候,會(huì)有兩種方式向操作系統(tǒng)申請(qǐng)
    的頭像 發(fā)表于 11-13 11:42 ?3454次閱讀
    malloc 申請(qǐng)<b class='flag-5'>內(nèi)存</b>的兩種<b class='flag-5'>方式</b>

    jvm配置內(nèi)存初始值參數(shù)

    JVM(Java Virtual Machine)是Java語(yǔ)言的運(yùn)行環(huán)境,它通過(guò)解釋字節(jié)碼并執(zhí)行相應(yīng)的指令來(lái)運(yùn)行Java程序。在JVM中,(Heap)是用于存儲(chǔ)對(duì)象實(shí)例的內(nèi)存區(qū)域。而在Java
    的頭像 發(fā)表于 12-05 14:17 ?1027次閱讀

    和棧的區(qū)別和使用注意事項(xiàng)

    和棧是在計(jì)算機(jī)科學(xué)中廣泛使用的兩種數(shù)據(jù)結(jié)構(gòu),它們具有不同的用途和特點(diǎn)。和棧的區(qū)別涉及到內(nèi)存分配、訪問(wèn)方式、數(shù)據(jù)存儲(chǔ)等方面。在使用
    的頭像 發(fā)表于 01-18 17:24 ?2831次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品