使用new運算符分配一個變量
格式:
P = new T;
其中T是任意類型名,P是類型為T*的指針。
使用該表達(dá)式動態(tài)分配出一片大小為sizeof(T)字節(jié)的內(nèi)存空間。并且將該內(nèi)存空間的其實地址賦值給P。
例如:
#include<iostream>
using namespace std;
int main() {
int* p = new int;
*p = 5;
return 0;
}
在上述程序中,為p動態(tài)分配了sizeof(int)大小的空間,并將起始地址賦值給了p。
使用new運算符分配一個數(shù)組
格式:
P = new T[N];
其中T是任意類型名,P是類型為T*的指針,N是要分配的數(shù)組元素的個數(shù),N可以是表達(dá)式。
使用該表達(dá)式動態(tài)分配出N*sizeof(T)字節(jié)的內(nèi)存空間,并將起始地址瀆職給P。
例如:
#include<iostream>
using namespace std;
int main() {
int* p = new int[10];
p[0] = 1;
p[9] = 10;
p[10] = 10;//越界
return 0;
}
在上述程序中,為p動態(tài)分配了10 * sizeof(int)大小的空間,并將起始地址賦值給了p。
為數(shù)組分配完空間后就可以像訪問數(shù)組一樣訪問該指針。但是需要注意的是在執(zhí)行p[10] = 10;時會導(dǎo)致數(shù)組越界,編譯器又可能不會報錯。
使用delete運算符釋放動態(tài)分配的內(nèi)存
使用new運算符動態(tài)分配的內(nèi)存空間,一定要使用delete運算符進(jìn)行釋放。
delete變量
格式:
delete 指針;//該指針必須指向new出來的空間
例如:
#include<iostream>
using namespace std;
int main() {
int* p = new int;
delete p;
delete p;//報錯,只能delete一次
return 0;
}
在使用delete時只能對同一片空間使用一次delete,否則將會報錯,如上程序所示。
delete數(shù)組
格式:
delete []指針;//該指針必須指向new出來的空間
使用delete釋放動態(tài)分配的數(shù)組時,要添加[]。
例如:
#include<iostream>
using namespace std;
int main() {
int* p = new int[10];
delete []p;
delete p;//錯誤,只會釋放第一個元素的空間
return 0;
}
使用delete []p;來正確釋放動態(tài)分配的內(nèi)存空間,指針前有[]符;當(dāng)使用delete p;時,將導(dǎo)致該數(shù)組的首元素空間被釋放,而其余空間未被釋放,形成“野指針”。