可能許多人對記憶體分配上的「棧
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 堆用於存放全域性變數,靜態變數,常量字串和函式 函式體的二進位制 二 申請後系統的響應 棧 只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體...