所謂動態資料結構,是指在運行時刻才能確定所需記憶體空間大小的資料結構,動態資料結構所使用的的記憶體稱為動態記憶體。動態記憶體的使用有一定的危險,必須遵守一定的規則。動態申請的記憶體在不需要時必須及時釋放,如果不斷地申請動態記憶體而不加以釋放,將導致記憶體資源的枯竭。
c++處理動態記憶體提供了一對操作符new和delete。new操作符用於動態申請記憶體,而delete操作符則用來釋放動態申請的記憶體。如果對象中為指標型屬性申請了動態記憶體,則必須在解構函式中加以釋放。
在c++中,動態記憶體和指標變數是密切相關的,將指標變數和c++中的new和delete操作符結合起來,用來申請和釋放動態記憶體。
在程式運行過程中,當確定了資料所需記憶體空間的大小後,可以用new操作符請求系統分配足夠的記憶體以存放該資料,並返回指向新申請到的記憶體地區的指標,如果申請不成功(這通常是因為記憶體空間不夠),則返回null 指標NULL。
例如,下面的程式段中,new以資料類型T為參數,為類型為T的變數申請記憶體,返回得到記憶體位址。
T*p; //定義p為指向T的指標
p=new T;//p為類型T資料的記憶體位址
又如,當p1和p2分別為指向int和long類型資料的指標時,操作符new可以為它們分別申請相應的記憶體空間並將其他地址分別賦給p1和p2。
int*p1; //定義p1為指向int(2位元組大小)的指標
long*p2; //定義p2為指向long(4位元組大小)的指標
p1=new int; //p1指向記憶體中的一個整數
p2=new long;//p2指向記憶體中的一個長整數
預設情況下,new申請的記憶體中的內容沒有初值,如果需要初值,必須使用操作符new的參數形式:
p=new T(value);
如下述操作:
p1=new int(100);
為整數申請記憶體並對其賦初值100,p1指向一個初值為100的整數。在c++中,不僅可以動態申請單一資料型別的記憶體空間,也可以申請複雜的資料類型,如動態數組的申請。程式中需要申請動態數組時,可用帶方括弧“[ ]”的new操作符為數組申請記憶體。例如:
T*p; 定義p為指向T的指標
p=new T[n]; 為類型為T的n元數組申請記憶體
將p指向數組的第一個元素。和單一資料型別不同,用這種方法申請數組時不能指定初始值。當申請的動態記憶體不再需要時,使用delete操作符加以釋放。需要注意的是,delete的使用形式必須和new相匹配。例如:
T*p1,*p2; //p1和p2均為指向類型T的指標
p1=new T; //p1指向一個類型為T的資料
p2=new T[n]; //p2指向一個類型為T的n元數組
操作符delete使用這些指標來釋放為它們申請的記憶體,但在釋放數組時,必須與“[ ]”運算子結合使用:
delete p1;//釋放p1指向的簡單變數空間
delete [ ] p2; //釋放p2指向的陣列變數空間