記憶體堆疊

handawei_5發表於2010-04-30
堆疊是一種執行“後進先出”演算法的資料結構。

設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以“先進後出”就是這種結構的特點。

堆疊就是這樣一種資料結構。它是在記憶體中開闢一個儲存區域,資料一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指標總指向最後一個壓入堆疊的資料所在的資料單元,存放這個地址指標的暫存器就叫做堆疊指示器。開始放入資料的單元叫做“棧底”。資料一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個資料壓入堆疊,就放在和前一個單元相連的後面一個單元中,堆疊指示器中的地址自動加1。讀取這些資料時,按照堆疊指示器中的地址讀取資料,堆疊指示器中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了後進先出的原則。

堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實現的。
堆疊可以用陣列儲存,也可以用以後會介紹的連結串列儲存。
下面是一個堆疊的結構體定義,包括一個棧頂指標,一個資料項陣列。棧頂指標最開始指向-1,然後存入資料時,棧頂指標加1,取出資料後,棧頂指標減1。
 
堆和棧是兩個不同的概念。

簡單的來講堆(heap)上分配的記憶體,系統不釋放,而且是動態分配的。棧(stack)上分配的記憶體系統會自動釋放,它是靜態分配的。執行時棧叫堆疊。棧的分配是從記憶體的高地址向低地址分配的,而堆則相反。

由malloc或new分配的記憶體都是從heap上分配的記憶體,從heap上分配的記憶體必須有程式設計師自己釋放,用free來釋放,否則這塊記憶體會一直被佔用而得不到釋放,就出現了“記憶體洩露(Memory Leak)”。這樣會造成系統的可分配記憶體的越來越少,導致系統崩潰。

題外:很多人認為在程式中儘量使用堆而不使用棧,因為堆疊溢位很危險。其實堆溢位比棧溢位更危險。哈哈~!

相關文章