前言:最近正在學習有關static的知識,發覺對C++的內存分區不是很瞭解,上網查了不少資料,遂將這幾天的學習筆記進行了簡單整理,發表在這裏
• 棧區(stack):主要用來存放函數的參數以及局部變量。棧區由系統進行內存管理,在函數完成執行時,系統會自行釋放棧區的內存,而不須要用戶參與管理。整個程序的棧區的大小能夠在編譯器中由用戶自行設定,默認的棧區大小爲3Mhtml
• 堆區(heap):由用戶手動申請,手動釋放。若是用戶忘記對其所申請的內存資源進行釋放,該內存資源可能會在程序結束時由操做系統(OS)進行釋放(也可能不會)ios
[注意]:數據結構
1.C++系統內存分區中的堆和數據結構中的堆是不一樣的,但C++內存分區中的堆對系統資源的分配方式和數據結構中的鏈表卻十分類似函數
2.在C中用戶一般用malloc進行內存的申請,用free進行內存的釋放;而在C++中用戶一般用new進行內存的申請,用delete進行內存的釋放(C++一樣支持malloc/free方式)。學習
3.一般認爲C++中有兩個動態內存區域。經過new/delete方式進行內存資源的分配和釋放的稱爲自由存儲區(free store),而經過malloc/free方式進行內存資源的分配和釋放的稱爲堆區(heap)。但本質上來講不少編譯器中的new操做符是經過malloc進行內存申請的,所以能夠將堆區理解爲自由存儲區的一個具體實現,雖然兩者不徹底相同,但不少時候能夠混爲一談。 (若是想細究堆區和自由存儲區的不一樣,能夠參考這個博客:http://www.cnblogs.com/QG-whz/p/5060894.html)spa
4.new與malloc的幾點不一樣:操作系統
• malloc是C語言中的函數,而new是C++中的操做符指針
• malloc申請以後返回的類型是void*,而new返回的指針則是帶有特定數據類型的code
• malloc只負責內存的分配而不會調用類的構造函數,而new不只會分配內存,並且會自動調用類的構造函數htm
• 靜態區(全局區)(static):用來存放程序的全局變量和靜態變量。在C語言中,初始化的全局變量和靜態變量放在一塊內存區域中,而未初始化的全局變量和靜態變量放在與之相鄰的另外一塊內存區域中。而在C++中則沒有在靜態區中將初始化的和未初始化的變量進行分開存儲,由於C++會對未初始化的全局變量和靜態變量進行默認初始化(通常默認初始化爲0)。該區域存儲的數據會在程序結束後由系統來釋放。
[注意]:
全局變量和靜態全局變量在C++中的存儲方式是同樣的,但不一樣的是全局變量在整個源代碼中都是可使用的,而靜態全局變量只能在當前文件中使用。好比一個程序有3個文件a.cpp、b.cpp和c.cpp,若是在文件a.cpp中定義了一個全局變量x,那麼該變量x在文件a.cpp、b.cpp和c.cpp中均可以使用;但若是在文件a.cpp中定義了一個靜態全局變量y,那麼該變量y只能在文件a.cpp中使用文件b.cpp和文件c.cpp都不可使用該靜態全局變量y
• 常量存儲區:用來存儲程序中的常量,好比const常量,字符串常量等都存儲在這個區域。該區域存儲的數據會在程序結束後由系統來釋放
[注意]:
1.在程序運行期間,該區域中存儲的常量是全局可見的。
2.當咱們定義char *ptr="Tomwenxing"時,字符串「Tomwenixng」就存儲在這個區域
• 代碼區:存放程序體的二進制代碼。好比咱們在程序中自定義的函數,其函數體就是以二進制代碼的形式存儲在這個區域的
• 實例:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int value1=10; //全局變量:存儲在靜態區(全局區) 5 const int value2=10; //const常量:存儲在常量區 6 static int value3=10; //static變量:存儲在靜態區 (全局區) 7 8 //函數func:存儲在代碼區 9 void func(int a){ //a爲函數參數:存儲在棧區 10 int temp=10; //局部變量:存儲在棧區 11 static int temp2; //靜態變量(默認初始化爲0):存儲在靜態區(全局區) 12 cout<<"This is func"<<endl; // "This is func"是字面值常量:存儲在常量區 13 } 14 15 //函數main:存儲在代碼區 16 int main(){ 17 int value4=10; //局部變量;存儲在棧區 18 char *ptr1=NULL; //局部變量:存儲在棧區 19 static int value5=10; //靜態變量:存儲在靜態區(全局區) 20 char *ptr2="Tomwenxing"; //ptr2爲局部變量:存儲在棧區; "Tomwenxing"爲字面值常量:存儲在常量區 21 ptr1=(char*)malloc(sizeof(char)*100); // malloc動態開闢的空間:存儲在堆區 22 strcpy(ptr1,"Hello"); //"Hello"是字面值常量:存儲在常量區 23 free(ptr1); 24 int *ptr3=new int; //ptr3爲局部變量:存儲在棧區;new動態開闢的空間:存儲在堆區(自由存儲區) 25 delete ptr3; 26 return 0; 27 }