理解程序在內存中的分佈,是掌握指針、動態分配、作用域與生命週期的基石。本文系統梳理 C/C++ 進程虛擬地址空間的五大區域,並對比它們的特性、管理方式與典型用例。
由高地址向低地址依次為:
malloc/free、new/delete 動態分配。程序員手動管理,靈活但易產生碎片、洩漏;頻繁分配釋放會影響性能。const 全局)。隨可執行文件加載,佔用文件體積。| 區域 | 管理者 | 增長方向 | 存放內容 | 生命週期 |
|---|---|---|---|---|
| 棧 | 編譯器 | 高→低 | 局部變量、參數、返回值、調用幀 | 函數調用期間 |
| 堆 | 程序員 | 低→高 | 動態分配內存 | 手動釋放或程序結束 |
| BSS | 系統 | 固定 | 未初始化全局/靜態變量 | 程序全程 |
| Data | 系統 | 固定 | 已初始化全局/靜態變量 | 程序全程 |
| Text | 系統 | 固定 | 機器碼、字面常量 | 程序全程 |
malloc 必須配對 free,RAII 智能指針可自動化管理。char *p = "abc"; p[0]='x'; 導致段錯誤,因常量駐留只讀代碼段。應用 char p[] = "abc"; 放棧上。size 查看段大小:size a.outpmap 觀察運行時映射:pmap PIDvalgrind 檢測堆錯誤:valgrind --leak-check=full ./prog熟練掌握內存佈局,能讓你寫出更安全、高效、可移植的系統級代碼。