內存泄漏的原理
只有在堆內存里面才會發生內存泄漏的問題,在棧內存中不會發生內存泄漏。因為棧內存在自動分配空間之后,還會自動釋放空間。
什么是堆內存?存儲方式是什么樣的呢?
首先我們先來介紹一下堆內存在C代碼中的存儲方式。C代碼中動態申請堆內存的申請函數是malloc,常見的內存代碼如下圖所示:
因為malloc函數返回值是一個內存地址,所以保存堆內存的變量一定得是一個指針,當然這個變量可以是一個單指針,也可以是一個多重指針。
如何獲取堆內存?
對于堆內存的獲取方法,我們可以有兩種方法,第一種是用返回值傳遞內存指針,第二種方法是通過參數傳遞給內存指針。上面我們用到的malloc申請內存,就是屬于方法一的一種具體表現形式,是直接把返回值傳遞給內存指針。
方法一:把函數返回值直接賦值給指針,一般表現形式如下:
方法二:將指針地址作為函數返回參數,通過返回參數保存堆內存地址,一般表現形式如下:
總結:這兩類方法的本質是一樣的,都是函數內存間接申請了內存,但是只有傳遞內存的方法不一樣,方法一是通過返回值傳遞內存指針,方法二是通過參數傳遞內存指針。
內存泄漏的三個原因
當我們的代碼出現內存泄漏的時候,一般都會包含以下幾個原因:1、函數內有局部指針變量定義;2、對該局部指針有獲取內存的操作;3、在函數返回前沒有釋放該內存,也未保存到其他全局變量或返回上一級函數。
如何檢查內存泄漏
為了避免檢查內存泄漏,我們還是要養成良好的編碼習慣。當我們要進行檢查內存泄漏問題的時候,一般要做到以下三點:
(1)當我們在函數中看到有局部指針的時候,一定要仔細檢查是否有存泄漏的問題發生,養成仔細檢查的習慣;
(2)如果有局部變量,并且有對局部變量賦值的操作,要檢查函數的返回的指針到底是指向什么?是全局變量、靜態數據還是堆內存?如果代碼中有不熟悉的接口,要找到對應接口文檔或源代碼分析,保證不要出現不必要的錯誤;
(3)如果函數中有對局部指針有內存申請的操作,那么要檢查被保存的是全局變量嗎?會被作為函數返回值嗎?如果都不是的話,那要排查函數所有的“return”的地方,要保證內存被正確釋放,不占用內存。
編輯:jq
-
函數
+關注
關注
3文章
4327瀏覽量
62573 -
代碼
+關注
關注
30文章
4780瀏覽量
68527 -
C代碼
+關注
關注
1文章
89瀏覽量
14297
原文標題:一篇文章幫你解決C語言中的內存泄漏問題
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論