動態分配函數
動態分配能夠說是指針的關鍵所在。不須要經過定義變量,就能夠將指針指向分配的內存。也許這個概念看起來比較模糊,可是確實比較簡單。下面的代碼示範如何爲一個整數分配內存:spa
int *pNumber; pNumber = new int;
第一行申明瞭一個指針pNumber,第二行分配一個整數內存,而且將pNumber指向這個新內存。下面是另外一個例子,此次用一個浮點數:指針
double *pDouble; pDouble = new double;
動態分配有什麼不一樣的呢?當函數返回或者程序運行到當前塊之外時,你動態分配的內存將不會被刪除。所以,若是咱們用動態分配重寫上面的例子,能夠看到如今可以正常工做了。code
#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仍舊指向有用的東西。這是由於使用了動態分配。確信你已經理解它了。那麼繼續向下看,瞭解爲何上面的程序還會有一系列的錯誤。blog
內存分配和內存釋放內存
這裏有一個問題,可能會變得十分嚴重,雖然它很容易補救。這個問題就是,雖然你用動態分配能夠方便的讓內存完好無損,確實不會自動刪除,除非你告訴計算機,你再也不須要這塊內存了,不然內存將一直被分配着。所以結果就是,若是你不告訴計算機你已經使用完這塊內存,那麼它將成爲被浪費的空間,由於其它程序或者你的應用程序的其它部分不能使用這塊內存。最終將致使系統由於內存耗盡而崩潰。所以這個問題至關重要。內存使用完後釋放很是容易:it
delete pPointer;
須要作的就是這些。可是你必須肯定,你刪除的是一個指向你實際分配的內存的指針,而不是其它任何垃圾。嘗試用delete已經釋放的內存是危險的,而且可能致使程序崩潰。io
這裏再次舉個例子,此次修改之後就不會有內存浪費了。編譯
#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;