只有在堆內存里面才會發(fā)生內存泄漏的問題,在棧內存中不會發(fā)生內存泄漏。因為棧內存在自動分配空間之后,還會自動釋放空間。
什么是堆內存?存儲方式是什么樣的呢?
首先我們先來介紹一下堆內存在C代碼中的存儲方式。C代碼中動態(tài)申請堆內存的申請函數(shù)是malloc,常見的內存代碼如下圖所示:
因為malloc函數(shù)返回值是一個內存地址,所以保存堆內存的變量一定得是一個指針,當然這個變量可以是一個單指針,也可以是一個多重指針。
如何獲取堆內存?
對于堆內存的獲取方法,我們可以有兩種方法,第一種是用返回值傳遞內存指針,第二種方法是通過參數(shù)傳遞給內存指針。上面我們用到的malloc申請內存,就是屬于方法一的一種具體表現(xiàn)形式,是直接把返回值傳遞給內存指針。
方法一:把函數(shù)返回值直接賦值給指針,一般表現(xiàn)形式如下:
方法二:將指針地址作為函數(shù)返回參數(shù),通過返回參數(shù)保存堆內存地址,一般表現(xiàn)形式如下:
總結:這兩類方法的本質是一樣的,都是函數(shù)內存間接申請了內存,但是只有傳遞內存的方法不一樣,方法一是通過返回值傳遞內存指針,方法二是通過參數(shù)傳遞內存指針。
內存泄漏的三個原因
當我們的代碼出現(xiàn)內存泄漏的時候,一般都會包含以下幾個原因:
- 函數(shù)內有局部指針變量定義
- 對該局部指針有獲取內存的操作
- 在函數(shù)返回前沒有釋放該內存,也未保存到其他全局變量或返回上一級函數(shù)
如何檢查內存泄漏
為了避免檢查內存泄漏,我們還是要養(yǎng)成良好的編碼習慣。當我們要進行檢查內存泄漏問題的時候,一般要做到以下三點:
- 當我們在函數(shù)中看到有局部指針的時候,一定要仔細檢查是否有存泄漏的問題發(fā)生,養(yǎng)成仔細檢查的習慣
- 如果有局部變量,并且有對局部變量賦值的操作,要檢查函數(shù)的返回的指針到底是指向什么?是全局變量、靜態(tài)數(shù)據(jù)還是堆內存?如果代碼中有不熟悉的接口,要找到對應接口文檔或源代碼分析,保證不要出現(xiàn)不必要的錯誤
- 如果函數(shù)中有對局部指針有內存申請的操作,那么要檢查被保存的是全局變量嗎?會被作為函數(shù)返回值嗎?如果都不是的話,那要排查函數(shù)所有的“return”的地方,要保證內存被正確釋放,不占用內存
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
存儲
+關注
關注
13文章
4122瀏覽量
85271 -
內存
+關注
關注
8文章
2902瀏覽量
73534 -
函數(shù)
+關注
關注
3文章
4235瀏覽量
61964
發(fā)布評論請先 登錄
相關推薦
堆棧內存和堆內存之間的區(qū)別
編寫有效的代碼需要了解堆棧和堆內存,這使其成為學習編程的重要組成部分。不僅如此,新程序員或職場老手都應該完全熟悉堆棧內存和堆內存之間的區(qū)別,
發(fā)表于 08-07 12:23
?560次閱讀
內存管理實例中運行Test函數(shù)會有什么樣的結果
); strcpy(str, "helloworld"); printf(str);}運行Test函數(shù)會有什么樣的結果?答: 程序崩潰;原因:1、實參是通過拷貝的方式 傳遞給行參
發(fā)表于 01-22 16:15
【原創(chuàng)】堆內存的那些事
區(qū)域那樣有明顯的分界線。堆內存的釋放看下面這個圖:看到這樣頻繁的使用區(qū)域和釋放,那么很容易看出堆內存是不連續(xù)的,跟堆
發(fā)表于 07-12 09:48
堆和棧的區(qū)別是什么
在回答完進程的虛擬地址空間布局之后(上一篇),面試官可能抓住堆和棧深入展開。堆和棧的區(qū)別①管理方式:棧由編譯器自動管理;堆由程序員控制,使用方便,但易產(chǎn)生
發(fā)表于 12-22 07:26
單片機下的堆和棧是什么樣的分布呢?
是基于os層來聊的。那么,在赤裸裸的單片機下的堆和棧是什么樣的分布呢?以下是網(wǎng)摘:剛接手STM32時,你只編寫一個int main(){while(1);}BUILD://Prog...
發(fā)表于 01-25 07:07
ESP8266上的內存類型有多少?
arduino 草圖時,我使用什么樣的內存?如果我存儲一些非易變的東西但程序在哪里運行,我可以使用 SPIFFS?在公羊?我有多少內存?
發(fā)表于 02-24 06:34
未來存儲技術的發(fā)展是什么樣的
未來的存儲技術會是什么樣子呢?對于基于NVMe的傳統(tǒng)Flash技術,我們應該繼續(xù)期望更高的容量。
發(fā)表于 09-18 14:39
?1282次閱讀
5G給內存和存儲帶來了什么樣的發(fā)展美光科技的解答
內存和存儲的區(qū)別越來越模糊,在2021年,將看到企業(yè)正在尋求新型解決方案,例如存儲級內存和內存虛擬化,以進一步釋放AI及激增的數(shù)據(jù)量帶來的
什么是堆內存?堆內存是如何分配的?
在一般的編譯系統(tǒng)中,堆內存的分配方向和棧內存是相反的。當棧內存從高地址向低地址增長的時候,堆內存
程序內存分區(qū)中的堆與棧
與棧表示兩種內存管理方式; (2)數(shù)據(jù)結構場景下,堆與棧表示兩種常用的數(shù)據(jù)結構。 1.程序內存分區(qū)中的堆與棧 1.1 棧簡介 棧由操作系統(tǒng)自
malloc 申請內存的兩種方式
我們知道m(xù)alloc() 并不是系統(tǒng)調用,也不是運算符,而是 C 庫里的函數(shù),用于動態(tài)分配內存。 malloc 申請內存的時候,會有兩種方式向操作系統(tǒng)申請堆
jvm配置堆內存初始值參數(shù)
JVM(Java Virtual Machine)是Java語言的運行環(huán)境,它通過解釋字節(jié)碼并執(zhí)行相應的指令來運行Java程序。在JVM中,堆(Heap)是用于存儲對象實例的內存區(qū)域。而在Java
堆和棧的區(qū)別和使用注意事項
堆和棧是在計算機科學中廣泛使用的兩種數(shù)據(jù)結構,它們具有不同的用途和特點。堆和棧的區(qū)別涉及到內存分配、訪問方式、數(shù)據(jù)存儲等方面。在使用
評論