C 中關於new和delete的使用

2021-06-27 00:45:09 字數 1977 閱讀 2103



在c++中,可以使用new和delete動態建立和釋放陣列或者單個物件

1.建立動態陣列

陣列型別的變數有三個重要的限制:陣列長度固定不變,在編譯時必須知道它的長度,陣列只在定義它的塊語句中存在。對於動態分配的陣列,雖然長度是固定的,但是動態分配的陣列不必在編譯時知道其長度,可以(通常也是)在執行時才確定陣列長度;同時,動態分配的陣列一直存在直到程式顯示釋放為止,這樣,我們就可以自己決定陣列的存在與否了。

每個程式在執行時都占用一塊可用的記憶體空間,用於存放動態分配的物件,此記憶體空間稱為程式的自由儲存區(free store)或堆(heap).c++語言使用new和delete在自由儲存區中分配儲存空間。

動態分配陣列時,只需指定型別和陣列長度,不必為陣列物件命名,new表示式返回指向新分配陣列的第乙個元素的指標:

int *pia=new int[10];

此new表示式分配了乙個含有10個int型元素的陣列,並返回指向該陣列第乙個元素的指標。在自由儲存區建立的陣列物件是沒有名字的,程式設計師只能通過其位址間接地訪問堆中的物件。

動態分配陣列時,如果陣列元素具有類型別,將使用該類的預設建構函式實現初始化;如果陣列元素是內建型別,則無初始化:

string *psa = new string[10];  // 呼叫string類的預設建構函式依次初始化陣列中的每個元素。

int *pis = new int[10];   //無初始化值

可使用跟在陣列長度後面的一對空圓括號,對陣列元素作值初始化:

int *pis = new int[10]();  //陣列元素都設定為0

之所以要動態分配陣列,往往是由於編譯時並不知道陣列的長度。c++中允許動態分配空陣列:

size_t n = get_size();

int *p = new int[n];

for(int *q=p;q!=p+n;++q)

『/*處理陣列元素的相關***/』

在上面的例子中,只有在程式執行時才能確定n的值。如果n的值為0,**依然正確執行。c++中雖然不允許定義長度為0的陣列變數,但是明確指出,呼叫new動態建立長度為0的陣列是合法的。

char *cp = new char[10];

用new動態建立長度為0的陣列時,new返回有效的非零指標,但不能進行解引用,因為它畢竟沒有指向任何元素。

2. 動態建立單個物件

動態建立物件時,只需指定其資料型別,不必為該物件命名,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件:

int *pi = new int(1024);

string *ps = new string(10, '9');

在c++中使用直接初始化語法規則初始化動態建立的物件,上面的表示式就使用該語法規則初始化了動態建立的物件。對於類型別的物件,則使用該類型別的建構函式初始化物件。可對動態建立的物件做值初始化,如下所示:

string *ps = new string();

int *pi = new int();

對於提供了預設建構函式的類型別,沒有必要進行值初始化。如果沒有顯示初始化動態建立的物件,則對於類型別的物件,用該類的預設建構函式初始化,對於內建型別的物件則無初始化。

3. 動態空間的釋放

動態分配的記憶體最後必須進行釋放。如果不需要動態建立的陣列,我們必須顯示地將其占用的儲存空間返還給程式的自由儲存區。c++中使用delete [ ]表示式釋放指標所指向的陣列空間:

delete [ ] pis;

該語句釋放上面所建立的動態int型陣列所占有的儲存空間。在關鍵字delete和指標之間的[ ]告訴編譯器該指標指向的是自由儲存區中的陣列,而並非單個物件。對於表示式 

delete pi; 

該命令釋放了pi指向的int型物件所占用的記憶體空間。刪除指標後,該指標變成懸垂指標(dangling pointer).懸垂指標指向曾今存放物件的記憶體但該物件已經不存在了。懸垂指標往往導致程式錯誤,而且很難檢測出來。一旦刪除了指標所指向的物件,立即將指標置為0,這樣就非常清楚地表明指標不再指向任何物件。

C 中關於new和delete的使用

1.建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道它的長度,陣列只在定義它的塊語句中存在。對於動態分配的陣列,雖然長度是固定的,但是動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才確定陣列長度 同時,動態分配的陣列一直存在直到程式顯示釋放為止,這樣,...

C 中關於new和delete的使用

1.建立動態陣列 陣列型別的變數有三個重要的限制 陣列長度固定不變,在編譯時必須知道它的長度,陣列只在定義它的塊語句中存在。對於動態分配的陣列,雖然長度是固定的,但是動態分配的陣列不必在編譯時知道其長度,可以 通常也是 在執行時才確定陣列長度 同時,動態分配的陣列一直存在直到程式顯示釋放為止,這樣,...

C 中new和delete的用法

首先,new和delete運算子是用於動態分配和撤銷記憶體的運算子。一 new用法 1.開闢單變數位址空間 使用new運算子時必須已知資料型別,new運算子會向系統堆區申請足夠的儲存空間,如果申請成功,就返回該記憶體塊的首位址,如果申請不成功,則返回零值。new運算子返回的是乙個指向所分配型別變數 ...