收藏 C Tips 7 堆記憶體分配

2021-04-01 18:35:28 字數 2421 閱讀 7346

/*這一系列文章《c++ tips》是公司code committee專家會推薦工程師看的,感覺很好,拿出來與大家共同提高。並不是知道多少會使人與人產生差別,真正的差別在於你能做到多少。

--coofucoo

*/

在堆上分配記憶體

可能許多人對記憶體分配上的「棧stack」和「堆heap」還不是很明白。包括一些科班出身的人也不明白這兩個概念。簡單的來講,stack上分配的記憶體系統自動釋放,heap上分配的記憶體,系統不釋放,哪怕程式退出,那一塊記憶體還是在那裡。stack一般是靜態分配記憶體,heap上一般是動態分配記憶體。

由malloc

系統函式分配的記憶體就是從堆上分配記憶體。從堆上分配的記憶體一定要自己釋放。用free釋放,不然就是術語——「記憶體洩露」(或是「記憶體漏洞」)——memory leak。於是,系統的可分配記憶體會隨malloc

越來越少,直到系統崩潰。還是來看看「棧記憶體」和「堆記憶體」的差別吧。

棧記憶體分配:(典型的函式:alloca)

char*

allocstrfromstack()

堆記憶體分配:(典型的函式:

malloc

char* allocstrfromheap(int len)

堆記憶體分配:(典型的函式:malloc

)char* allocstrfromheap(int len)

對於第乙個函式,那塊

pstr

的內存在函式返回時就被系統釋放了。於是所返回的

char*什麼也沒有。而對於第二個函式,是從堆上分配記憶體,所以哪怕是程式退出時,也不釋放,所以第二個函式的返回的記憶體沒有問題,可以被使用。但一定要呼叫

free釋放,不然就是

memory leak!

對於第乙個函式,那塊pstr

的內存在函式返回時就被系統釋放了。於是所返回的char*什麼也沒有。而對於第二個函式,是從堆上分配記憶體,所以哪怕是程式退出時,也不釋放,所以第二個函式的返回的記憶體沒有問題,可以被使用。但一定要呼叫free釋放,不然就是memory leak!

在堆上分配記憶體很容易造成記憶體洩漏,這是

c/c++的最大的「克星」,如果你的程式要穩定,那麼就不要出現

memory leak。

剛好前一段時間有乙個

linux上的服務應用程式,大約有幾百的

c檔案編譯而成,執行測試良好,等使用時,時間一長記憶體佔用率就偏高,搞得許多人焦頭爛額,查不出問題所在。出現這種問題就是

memeryleak

在 做怪了,在

c/c++中這種問題總是會發生,所以你一定要小心。乙個

rational的檢測工作——

purify,可以幫你測試你的程式有沒有記憶體洩漏。我保證,做過許多

c/c++的工程的程式設計師,都會對

malloc

或是 new有些感冒。當你什麼時候在使用

malloc

和 new時,有一種輕度的緊張和惶恐的感覺時,你就具備了這方面的修養了。

在堆上分配記憶體很容易造成記憶體洩漏,這是c/c++的最大的「克星」,如果你的程式要穩定,那麼就不要出現memory leak。

剛好前一段時間有乙個linux上的服務應用程式,大約有幾百的c檔案編譯而成,執行測試良好,等使用時,時間一長記憶體佔用率就偏高,搞得許多人焦頭爛額,查不出問題所在。出現這種問題就是memeryleak

在做怪了,在c/c++中這種問題總是會發生,所以你一定要小心。乙個rational的檢測工作——purify,可以幫你測試你的程式有沒有記憶體洩漏。我保證,做過許多c/c++的工程的程式設計師,都會對malloc

或是new有些感冒。當你什麼時候在使用malloc

和new時,有一種輕度的緊張和惶恐的感覺時,你就具備了這方面的修養了。

對於malloc

和free的操作有以下規則:

1) 配對使用,有乙個

malloc

,就應該有乙個

free。(

c++中對應為

new和

delete)

2) 盡量在同一層上使用,不要像上面那種,

malloc

在函式中,而

free在函式外。最好在同一呼叫層上使用這兩個函式。

3) malloc

分配的記憶體一定要初始化。

free後的指標一定要設定為

null。

4) 設計自己的記憶體分配鍊錶,記載已經分配的記憶體,便於在釋放的時候有備可查

注:雖然現在的作業系統(

linux和

memory leak的記憶體,所以,最好還是你自己來做這個工作。

收藏 C語言程式記憶體分配中的堆和棧

裡說的是c語言程式記憶體分配中的堆和棧。下面先談談c語言的記憶體管理 可執行程式在儲存時 沒有調到記憶體 分為 區 text 資料區 data 和未初始化資料區 bss 3個部分。1 區 text segment 存放cpu執行的機器指令 machine instructions 通常,區是可共享的...

記憶體的堆分配和棧分配

記憶體的堆分配和棧分配 備註 這一部分非常重要,如果錯誤請及時告知。謝謝 這裡是完全參考其他部落格。c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中的棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構...

記憶體的堆分配和棧分配

c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的存放區域。...