如果程序只需要一個值,則可能會聲明一個簡單變量,因為對於管理一個小型數據對象來說,這樣做比使用new和指針更簡單,盡管給人留下的印象不那么深刻。通常,對於大型數據(如數組、字符串和結構),應使用new,這正是new的用武之地。例如,假設要編寫一個程序,它是否需要數組取決於運行時用戶提供的信息。如果通過聲明來創建數組,則在程序被編譯時將為它分配內存空間。不管程序最終是否使用數組,數組都在那里,它占用了內存。在編譯時給數組分配內存被稱為靜態聯編(static binding),意味着數組是在編譯時加入到程序中的。但使用new時,如果在運行階段需要數組,則創建它;如果不需要,則不創建。還可以在程序運行時選擇數組的長度。這被稱為動態聯編(dynamic binding),意味着數組是在程序運行時創建的。這種數組叫做動態數組(dynamic array)。使用靜態聯編時,必須在編寫程序時指定數組的長度;使用動態聯編時,程序將在運行時確定數組的長度。
下面來看一下關於動態數組的兩個基本問題:如何使用C++的new運算符創建數組以及如何使用指針訪問元素。
1、使用new創建動態數組
在C++中,創建動態數組很容易;只要將數組的元素類型和元素數目告訴new即可。必須在類型名后加上方括號,其中包含元素數目。例如,要創建一個包含10個int元素的數組,可以這樣做:
int * psome = new int [10];
new運算符返回第一個元素的地址。在這個例子中,該地址被賦給指針psome。
當程序使用完new分配的內存塊時,應使用delete釋放它們。然而,對於使用new創建的數組,應使用另一種 格式的delete來釋放:
delete [] psome; // free a dynamic array
方括號告訴程序,應釋放整個數組,而不僅僅是指針指向的元素。請注意delete和指針之間的方括號。如果使用new時,不帶方括號,則使用delete也不應帶方括號。如果使用new時帶方括號,則使用delete時也應帶方括號。C++的早期版本無法識別方括號表示法。然而,對於ANSI/ISO標准來說,new與delete的格式不匹配導致的后果是不確定的,這意味着程序員不能依賴於某種特定的行為。下面是一個例子:
int * pt = new int;
short * ps = new short [500];
delete [] pt;
delete ps;
總之,使用new和delete時,應遵守以下規則。
~不要使用delete來釋放不是new分配的內存。
~不要使用delete釋放用一個內存塊兩次。
~如果使用new[]為數組分配內存,則應使用delete [ ] 來釋放。
~如果使用new 為一個實體分配內存,則應使用delete(沒有方括號)來釋放。
~對空指針應用delete是安全的。
為數組分配內存的通用格式如下:
type_name * pointer_name = new type_name [num_elements];