C/C++:堆與棧以及new簡單使用
阿新 • • 發佈:2018-12-21
C++中,記憶體分為5個區:堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。
名稱 | 特性 |
---|---|
棧 | 由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數、函式引數等。 |
堆 | 由new分配的記憶體塊,由程式設計師釋放(編譯器不管),一般一個new與一個delete對應,一個new[]與一個delete[]對應。如果程式設計師沒有釋放掉,資源將由作業系統在程式結束後自動回收。 |
自由儲存區 | 由malloc等分配的記憶體塊,和堆十分相似,用free來釋放。 |
全域性/靜態儲存區 | 全域性變數和靜態變數被分配到同一塊記憶體中(在C語言中,全域性變數又分為初始化的和未初始化的,C++中沒有這一區分)。 |
常量儲存區 | 這是一塊特殊儲存區,裡邊存放常量,不允許修改。 |
(注意:堆和自由儲存區其實不過是同一塊區域,new底層實現程式碼中呼叫了malloc,new可以看成是malloc智慧化的高階版本)
名稱 | 記憶體區域 | 大小限制 | 大小 | 空間使用效率 | 回收方法 |
---|---|---|---|---|---|
棧 | 連續 | 受限嚴重 | windows下棧大小是2M | 較高 | 區域性變數的記憶體空間自動回收 |
堆 | 不連續 | 基本不受限 | 理論上是4G | 較低 | 申請任意多少的記憶體,需用 free 或 delete 釋放記憶體。 |
在編寫程式的時候,一般的變數是可以直接存放在棧中的,但是有些時候也是需要使用一些較大的變數,這個時候就可能會出現棧放不下出現堆積的情況。這個時候就需要我們將變數轉移到堆中。
下邊是使用new建立堆變數簡單示例。
int *x = new int; //開闢一個存放整數的儲存空間,返回一個指向該儲存空間的地址(即指標)
int *a = new int(100); //開闢一個存放整數的空間,並指定該整數的初值為100,返回一個指向該儲存空間的地址
char *b = new char[10]; //開闢一個存放字元陣列(包括10個元素)的空間,返回首元素的地址
float *p=new float (3.14159);//開闢一個存放單精度數的空間,並指定該實數的初值為//3.14159,將返回的該空間的地址賦給指標變數p