用new運算符實現動態內存分配
1.第一種用法:給一個變量分配內存空間**
P = new T;
T是任意數據類型的名字,P是類型爲T*的指針
動態分配出一片大小爲sizeof(T)字節的內存空間,並且將該內存空間起始地址賦值給P,例如:
int *pn;
pn = new int; //分配一個int大小的內存,起始地址賦值給pn
*pn = 5; //通過指針間接訪問上述內存地址並賦值
2.第二種用法:給一個數組分配內存空間
P = new T[N];
T:任意數據類型名
P:類型爲T*的指針
N:要分配的數組的元素個數,可以是整型表達式
動態分配出一片大小爲N * sizeof(T)字節的內存空間,並將該內存空間的起始地址賦值給P。例如:
int *pn;
int i = 5;
pn = new int[i*20]; //i* 20 = 100;所以數組下標爲0-99
pn[0] = 20;
pn[100] = 30;//編譯並沒有問題,訪問時數組越界
new運算符的返回值類型
new T;
new T[n];
這兩個表達式的返回值的類型都是 T*
驗證:
int *p = new int; //賦值運算符兩邊的數據類型必須相同,
//所以側面驗證該返回值的數據類型是 T*
用delete運算符釋放動態分配的內存空間
用new分配的內存空間一定要用delete運算符進行釋放
delete 指針 ; //該指針必須指向new出來的空間
例如:(變量)
int *p = new int;
*p = 5;
delete p; //釋放內存空間
delete p; //導致異常,一片空間不能被釋放兩次
例如:(數組)
int *p = new int[20];
p[0] = 1;
delete []p; //注意指針前要加[]
若動態分配的存儲空間沒有被回收就會變成內存垃圾,在之後的程序運行中,該片內存將不會被使用,就被浪費掉了
————參考北大c++網課