一個由C/C++編譯的程序佔用的內存分爲如下幾個部分 程序員
一、棧區(stack):程序運行時由編譯器自動分配,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。程序結束時由編譯器自動釋放。 數據結構
二、堆區(heap):在內存開闢另外一塊存儲區域。通常由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表。 函數
三、全局區(static):編譯器編譯時即分配內存。全局變量和靜態變量的存儲是放在一塊的,初始化的 全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。程序結束後由系統釋放。 優化
四、文字常量區:常量字符串就是放在這裏的。程序結束後由系統釋放 spa
五、程序代碼區:存放函數體的二進制代碼。 code
一個網上常見的例子: 內存
#include<string.h> #include<stdlib.h> int a = 0;//全局初始化區 char *p1; //全局未初始化區 int main() { int b = 0;//棧 char s[] = "abc";//棧 char *p2;//棧 char *p3 = "123456";//123456\0在常量區,p3在棧上 static int c = 0;//全局初始化區 p1 = (char *)malloc(10); p2 = (char *)malloc(20);//分配獲得到空間在堆區 strcpy(p1,"123456");//123456\0放在常量區 //編譯器可能會將它與p3所指向的123456\0優化成一個地方 return 0; }
C/C++內存分配方式: 字符串
一、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。 編譯器
二、在棧上建立。 在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,可是分配的內存容量有限。 string
三、從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員本身負責在什麼時候用free或delete釋放內存。動態內存的生存期由程序員決定,使用很是靈活,但若是在堆上分配了空間,就有責任回收它,不然運行的程序會出現內存泄漏,頻繁地分配和釋放不一樣大小的堆空間將會產生堆內碎塊。