動態分配
動態分配可以說是指針的關鍵所在。不需要通過定義變量,就可以將指針指向分配的內存。也許這個概念看起來比較模糊,但是確實比較簡單。下面的代碼示范如何為一個整數分配內存:
int *pNumber; pNumber = new int;
第一行申明了一個指針pNumber,第二行分配一個整數內存,並且將pNumber指向這個新內存。下面是另一個例子,這次用一個浮點數:
double *pDouble; pDouble = new double;
動態分配有什么不同的呢?當函數返回或者程序運行到當前塊以外時,你動態分配的內存將不會被刪除。因此,如果我們用動態分配重寫上面的例子,可以看到現在能夠正常工作了。
#i nclude <stdio.h>
int *pPointer; void SomeFunction() { // make pPointer point to a new integer pPointer = new int; *pPointer = 25; } void main() { SomeFunction(); // make pPointer point to something printf("Value of *pPointer: %d/n", *pPointer); }
通讀一遍,編譯上面的代碼,確信你已經理解它是如何工作的。當調用SomeFunction時,分配了一些內存,並且用pPointer指向它。這次,當函數返回時,新內存就完整無缺了。因此pPointer仍舊指向有用的東西。這是因為使用了動態分配。確信你已經理解它了。那么繼續向下看,了解為什么上面的程序還會有一系列的錯誤。
內存分配和內存釋放
這里有一個問題,可能會變得十分嚴重,雖然它很容易補救。這個問題就是,雖然你用動態分配可以方便的讓內存完整無缺,確實不會自動刪除,除非你告訴計算機,你不再需要這塊內存了,否則內存將一直被分配着。因此結果就是,如果你不告訴計算機你已經使用完這塊內存,那么它將成為被浪費的空間,因為其它程序或者你的應用程序的其它部分不能使用這塊內存。最終將導致系統因為內存耗盡而崩潰。因此這個問題相當重要。內存使用完后釋放非常容易:
delete pPointer;
需要做的就是這些。但是你必須確定,你刪除的是一個指向你實際分配的內存的指針,而不是其它任何垃圾。嘗試用delete已經釋放的內存是危險的,並且可能導致程序崩潰。
這里再次舉個例子,這次修改以后就不會有內存浪費了。
#include <stdio.h>
int *pPointer; void SomeFunction() { // make pPointer point to a new integer pPointer = new int; *pPointer = 25; } void main() { SomeFunction(); // make pPointer point to something printf("Value of *pPointer: %d/n", *pPointer); delete pPointer; }
int * p = new int;
* p = 5;
delete p;
int * p2 = new int[5];
* p2 = 5;
delete[] p2;