C++ 動態分配 和 內存分配和內存釋放


動態分配

       動態分配可以說是指針的關鍵所在。不需要通過定義變量,就可以將指針指向分配的內存。也許這個概念看起來比較模糊,但是確實比較簡單。下面的代碼示范如何為一個整數分配內存:

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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM