1. 程式人生 > >C/C++:堆與棧以及new簡單使用

C/C++:堆與棧以及new簡單使用

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

參考

C++堆和棧的區別和聯絡 - yangyongUestc的部落格 - CSDN部落格

[C/C++] C++中new的語法規則 - Strawberry丶 - 部落格園