1. 程式人生 > >heap和stack的差別

heap和stack的差別

在進行C/C++程式設計時,需要程式設計師對記憶體的瞭解比較精確。經常需要操作的記憶體可分為一下幾個類別:

  • 棧區(stack):由編譯器自動分配和釋放,存放函式的引數值、區域性變數的值等。其操作方式類似於資料結構中的棧;
  • 堆區(heap):一般有程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由作業系統回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列;
  • 全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統釋放;
  • 文字常量區:常量字串就是放在這裡的。程式結束後由系統釋放;
  • 程式程式碼區:存放函式體的二進位制程式碼

PS:
每個程序在執行的時候,核心都會給其分配一塊記憶體,稱為程序地址空間。
這裡面除了固定的程式碼段(存放程式碼)、資料段、常量段、bss段等,其他的部分會被堆和棧進行共享

棧部分主要負責儲存程序的執行上下文,比如函式呼叫的引數、返回值,包括上一級的函式入口等等;同時函式中定義的臨時變數(auto變數)也儲存在棧空間中。當函式結束返回的時候,相應的變數也就失效

堆則主要用於動態記憶體分配,比如malloc,就是從堆中進行分配記憶體(當然也可以指定從棧中分配,但是一般比較少見)。從堆中動態分配的記憶體有個特點,其需要程式主動去釋放記憶體,比如free,如果不進行釋放,則會造成記憶體洩露