1. 程式人生 > >C++:內存分區

C++:內存分區

運行 stream () mes this 很多 棧區 ++ 鏈表


前言:最近正在學習有關static的知識,發覺對C++的內存分區不是很了解,上網查了很多資料,遂將這幾天的學習筆記進行了簡單整理,發表在這裏


? 棧區(stack):主要用來存放函數的參數以及局部變量。棧區由系統進行內存管理,在函數完成執行時,系統會自行釋放棧區的內存,而不需要用戶參與管理。整個程序的棧區的大小可以在編譯器中由用戶自行設定,默認的棧區大小為3M


? 堆區(heap):由用戶手動申請,手動釋放。如果用戶忘記對其所申請的內存資源進行釋放,該內存資源可能會在程序結束時由操作系統(OS)進行釋放(也可能不會)

[註意]:

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

4.new與malloc的幾點不同:

  ? malloc是C語言中的函數,而new是C++中的操作符

  ? malloc申請之後返回的類型是void*,而new返回的指針則是帶有特定數據類型的

  ? malloc只負責內存的分配而不會調用類的構造函數,而new不僅會分配內存,而且會自動調用類的構造函數


? 靜態區(全局區)(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 } 

C++:內存分區