前言
new和delete是C++中用來動態管理記憶體分配的運算子,其用法較為靈活。如果你對它們的幾種不同用法感到困惑,混淆,那麼接著看下去吧。
功能一:動態管理單變數/物件空間
下面例子使用new為單個變數/物件開闢空間:
1 // 建立一個指向整型元素的指標pi,其所指物件為整數100。 2 int *pi = new int(100); 3 4 // 建立一個指向字串元素的指標ps,其所指物件為字串"ssssssssss"。 5 string *ps = new string(10, 's');
對於開闢的單變數/物件空間,我們只能通過new操作符返回的指標來控制,而不能通過變數名/物件名。另外,如果上述定義式右邊的 () 為空,則對變數/物件進行值初始化,而如果連 () 都沒有,則進行預設初始化。(這裡假定你已清楚值初始化和預設初始化的區別)
當這部分空間使用完畢,應當使用delete將其回收,上述例子對應回收語句如下:
1 delete pi; 2 pi=NULL; 3 4 delete ps; 5 ps=NULL;
需要說明的是:1. 每個new都必須對應一個delete 2. 一個記憶體空間只能被delete一次 (下面這種功能實現也要滿足這兩點)
功能二:動態管理陣列空間
下面例子使用new為陣列開闢空間:
1 // 建立一個"陣列指標"pia,pia將指向一個含有10個整型元素的陣列的第一個元素。 2 int *pia = new int[10]; 3 4 // A是類名 5 // 建立一個"陣列指標"pib,pib將指向一個含有10個A類物件的陣列的第一個物件。 6 A *pib = new A[10];
對於開闢的陣列空間,我們只能通過new操作符返回的指標來控制,而不能通過陣列名。另外,如果上述定義式右邊末尾加上空 (),則陣列進行值初始化,否則陣列元素是未定義的(如本例)
當這部分空間使用完畢,應當使用delete將其回收,上述例子對應回收語句如下:
1 delete [] pia; 2 pia = NULL; 3 4 delete [] pib; 5 pib = NULL;
需要特別注意delete右邊的那個[],如果遺漏,將很可能導致難以預料的錯誤。