回覆列表
  • 1 # 使用者3417633067606

    簡單地說,棧是屬於程序管理的,大小相對固定,規模較小,一旦作業系統為程式分配了棧後就不管了,作業系統將其看做程序的一部分,棧的性質是先進後出,後進先出;堆屬於系統維護的,程序可以申請的額外記憶體空間,訪問方式是自由的(相對於棧的先進後出)。

    稍微深入點說,棧是由系統在載入程式時給程序分配的一塊區域,提供存放棧資料,一般定義的變數都會存在棧區,函式呼叫以及資料傳遞和返回、遞迴、巢狀迴圈,資料夾等樹狀層次結構的遍歷、表示式的解析都會用到棧區。棧的大小由編譯器決定,也可以在IDE(整合開發環境,比如VC, VS,VB或任何程式設計工具)中設定,編譯好的程式包含了棧空間大小的引數,當被作業系統載入時由作業系統一起分配給程式。當程式結束時棧區與程序空間一起被回收釋放。

    所以,如果定義的資料超過棧的空間程式就會發生溢位而崩潰,編譯器不負責檢查,因此大容量資料不要分配在棧上。在C++中,應該使用new關鍵詞,用new分配的物件或記憶體都是在堆上,堆是系統維護的記憶體空間,也可理解為作業系統中看到的未使用的空間,當執行new的時候就是程式向作業系統申請額外空間,因此new也叫動態分配記憶體。系統會根據需求大小從未使用的空間中劃一塊給程式使用,並對該空間進行註冊管理,以便當程式結束時釋放該空間(假如程式沒有主動申請釋放)。所以用new建立的空間在使用完了後要及時申請釋放(delete 關鍵詞),如果不釋放,在程式執行期間如果不斷的new大記憶體,最終也會將整個可用記憶體用完,導致系統崩潰,當然,如今的作業系統比以前強壯得多,當發生記憶體用完導致崩潰時,作業系統會干預,直接down掉程式禁止執行下去並回收所有所佔空間。

  • 中秋節和大豐收的關聯?
  • Ctrl+Shift+Esc和Ctrl+Shift+Del什麼區別?