棧記憶體與堆記憶體

2021-08-25 22:12:08 字數 1985 閱讀 2233

可能許多人對記憶體分配上的「棧

stack

」和「堆

heap

」還不是很明白,包括一些科班出身的人也不明白這兩個概念。簡單來講,

stack

上分配的記憶體系統自動釋放,

heap

上分配的記憶體,系統不釋放,哪怕程式退出,那一塊記憶體還是在那裡。

stack

一般是靜態分配記憶體,

heap

上一般是動態分配記憶體。 由

malloc

系統函式分配的記憶體就是從堆上分配記憶體。從堆上分配的記憶體一定要自己釋放。用

free

釋放,不然就是術語

——「記憶體洩露」(或是「記憶體漏洞」)

——memory leak

。於是,系統的可分配記憶體會隨

malloc

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

棧記憶體分配

char* 

allocstrfromstack() 

堆記憶體分配

allocstrfromheap(int len) 

對於第乙個函式,那塊

pstr

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

char*

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

free

釋放,不然就是

memory leak!

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

c/c++

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

memory leak

。所以,我還是要在這裡千叮嚀萬囑付,在使用

malloc

系統函式(包括

calloc

,realloc

)時千萬要小心。

記得有乙個

unix

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

c檔案編譯而成,執行測試良好,等使用時,每隔三個月系統就是

down

一次,搞得許多人焦頭爛額,查不出問題所在。只好,每隔兩個月人工手動重啟系統一次。出現這種問題就是

memery leak

在做怪了,在

c/c++

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

我保證,做過許多

c/c++

的工程的程式設計師,都會對

malloc

或是new

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

malloc

和new

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

malloc

和free

的操作有以下規則:

配對使用,有乙個

malloc

,就應該有乙個

free

。(c++

中對應為

new和

delete

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

malloc

在函式中,而

free

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

malloc

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

free

後的指標一定要設定為

null

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

unix

和win2k/nt

memory leak

的記憶體,所以,最好還是你自己來做這個工作。(有的時候不知不覺就出現

memory leak

了,而且在幾百萬行的**中找無異於海底撈針,

rational

有乙個工具叫

purify

,可能很好的幫你檢查程式中的

memory leak

)。

堆記憶體 棧記憶體

從堆和棧的功能和作用來通俗的比較,堆主要用來存放物件的,棧主要是用來執行程式的.而這種不同又主要是由於堆和棧的特點決定的 在程式設計中,例如c c 中,所有的方法呼叫都是通過棧來進行的,所有的區域性變數,形式引數都是從棧中分配記憶體空間的。實際上也不是什麼分配,只是從棧頂向上用就行,就好像工廠中的傳...

堆記憶體與棧記憶體的理解

記憶體中的堆與棧的根本區別在於堆記憶體由使用者自己申請,需要自己去釋放,否則會造成記憶體洩露,最終記憶體空間不夠。而棧記憶體則是由系統區釋放,程式設計師不需要自己去釋放。棧記憶體用來存放臨時申明的變數,如乙個函式中的區域性變數等。拿乙個函式為例,函式有返回值,函式引數 入參,出參 區域性變數,返回值...

棧記憶體與堆記憶體的區別

一 程式的記憶體分配 棧區 stack 有編譯器自動分配釋放,存放函式的引數,區域性變數等.堆區 heap 一般由程式設計師分配和釋放,否則就由 os 堆用於存放全域性變數,靜態變數,常量字串和函式 函式體的二進位制 二 申請後系統的響應 棧 只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體...