int n; int a[n]; //這種定義是不允許的但是在實際的程式設計中,往往會出現所需的記憶體空間大小取決於實際要處理的資料多少,而實際要處理的資料數量在程式設計時無法確定的情況。如果總是定義一個儘可能大的陣列,又會造成空間浪費。何況,這個“盡可能大”到底應該多大才夠呢?
T *p = new T;
其中,T 是任意型別名,p 是型別為 T* 的指標。int* p; p = new int; *p = 5;第二行動態分配了一片 4 個位元組大小的記憶體空間,而 p 指向這片空間。通過 p 可以讀寫該記憶體空間。
T *p =new T[N];
其中,T 是任意型別名,p 是型別為 T* 的指標,N 代表“元素個數”,可以是任何值為正整數的表示式,表示式中可以包含變數、函數呼叫等。這樣的語句動態分配出 N × sizeof(T) 個位元組的記憶體空間,這片空間的起始地址被賦值給 p。例如:int* pn; int i = 5 ; pn = new int[i*20]; pn[0] = 20 ; pn[100] = 30;最後一行編譯時沒有問題,但執行時會導致陣列越界。因為上面動態分配的陣列只有 100 個元素,pn[100] 已經不在動態分配的這片記憶體區域之內了。
delete p;
p 是指向動態分配的記憶體的指標。p 必須指向動態分配的記憶體空間,否則執行時很可能會出錯。例如:int* p = new int; *p = 5; delete p; delete p; //本句會導致程式出錯上面的第一條 delete 語句正確地釋放了動態分配的 4 個位元組記憶體空間。第二條 delete 語句會導致程式出錯,因為 p 所指向的空間已經釋放,p 不再是指向動態分配的記憶體空間的指標了。
delete[] p;
p 依然是指向動態分配的記憶體的指標。例如:int* p = new int[20]; p[0] = 1; delete[] p;同樣地,要求被釋放的指標 p 必須是指向動態分配的記憶體空間的指標,否則會出錯。
delete p
的方式釋放,沒有用[]
,則編譯時沒有問題,執行時也一般不會發生錯誤,但實際上會導致動態分配的陣列沒有被完全釋放。