第四篇:new和delete的基本用法

穆晨發表於2017-01-19

前言

       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右邊的那個[],如果遺漏,將很可能導致難以預料的錯誤。

相關文章