記憶體管理/堆疊和堆
外觀
< 記憶體管理
在大多數本地可執行程式中,有兩種型別的記憶體可用:基於棧的記憶體和基於堆的記憶體。

對於有棧的系統,系統棧最常用於提供幀。幀是區域性化子程式資訊的一種方法。一般來說,子程式的幀中必須包含返回地址(子程式完成時跳回的位置)和函式的輸入引數。當呼叫子程式時,所有這些資訊都會以特定順序被壓入棧中。當函式返回時,棧上的所有這些值都會被彈出,並被回收給系統,以便在以後的函式呼叫中使用。此外,子程式還可以使用棧作為本地變數的儲存空間。
整個過程,即在棧上建立幀和回收幀的過程,通常是透明的,由編譯器處理。程式設計師通常不瞭解這個過程,也不需要專門考慮它。
需要注意的一個陷阱是在棧上分配本地陣列時可能發生。如果函式寫入陣列末尾以外的記憶體位置,就會發生一個稱為緩衝區溢位的問題。緩衝區溢位是一個問題,因為資料值在棧上緊密儲存,在溢位時,你可以意外覆蓋這些值。如前所述,函式的返回值儲存在棧上。因此,如果這個值被覆蓋,函式將不會返回到正確的位置。一個勤奮的駭客可以使用這個事實來填充棧,使其包含非常特定的值,例如記憶體中病毒程式碼的地址。
棧儲存是固定的。也就是說,棧上分配的空間是在編譯時由編譯器設定的,並且在程式執行期間不會改變。
堆是一個動態分配記憶體的區域,由作業系統或記憶體管理器庫自動管理。堆上的記憶體會在程式執行期間經常被分配、釋放和調整大小,這會導致一個稱為碎片的問題。碎片是指當記憶體物件被分配時,它們之間留下了太小而無法容納其他記憶體物件的空間。最終結果是,堆空間中的一部分無法用於進一步的記憶體分配。
堆也容易受到溢位情況的影響,儘管結果通常沒有棧溢位那麼嚴重。駭客透過堆溢位破壞系統並非不可能,但特別困難。