首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C/C++ 內存分配管理全景圖:棧/堆/全局/常量/代碼區、malloc/new 差異、面試必考點

     編輯:C++ 入門

程序內存五大區域

區域內容管理方式生命週期
棧函數參數、局部變量、返回地址、寄存器保存編譯器自動分配/釋放函數調用期間
堆malloc/new 申請的動態內存程序員手動 free/delete,進程結束 OS 回收申請到釋放
全局/靜態區全局變量、static 變量 (分初始化/未初始化兩段)編譯時分配,進程結束釋放整個程序運行期
常量區字符串字面值、const 全局變量編譯時分配,只讀整個程序運行期
代碼區函數二進制機器碼只讀整個程序運行期

三種分配方式對比

  • 靜態分配:全局/靜態變量,編譯期確定地址大小。
  • 棧上分配:局部變量,CPU 指令 push/pop 級支持,極快,空間有限 (Win 默認 1-2MB)。
  • 堆上分配:malloc/free、new/delete,靈活大,但易產生碎片、洩漏,效率較低 (鏈表尋找塊)。

棧 vs 堆 詳細對比

維度棧堆
增長方向向低地址向高地址
連續性連續不連續 (鏈表管理空閒塊)
大小限制編譯期固定 (可調)受限於虛擬內存 (32位 4GB)
分配速度極快 (指令級)較慢 (庫函數搜索/分裂/合併)
碎片無 (先進後出)易產生外部碎片
適用場景小型、生命週期固定、高頻大型、動態、不定大小

new/delete vs malloc/free

  • new:調用構造函數,類型安全,拋出 bad_alloc,可重載。
  • malloc:僅分配原始字節,不調用構造函數,返回 void* 需強轉,失敗返回 NULL。
  • delete:調用析構函數;free 不調用。**嚴禁混用** (new 必配 delete,malloc 必配 free)。

變量屬性四要素

  1. 數據類型
  2. 存儲類型:auto(默認)、static、register、extern
  3. 作用域:局部/全局/文件/類/命名空間
  4. 存儲期:動態 (函數內自動變量) / 靜態 (全局、static、extern)

面試高頻陷阱

  • char *p = "abc"; → 字符串在常量區,p 在棧,p[0]='d' → **未定義行為 (段錯誤)**。
  • 棧上大數組導致棧溢出 → 改用 static 或堆分配。
  • 野指針、懸空指針、雙重釋放 → 釋放後置 nullptr,智能指針管理。
  • 內存對齊、結構體填充 → #pragma pack、成員排序優化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved