原文:http://see.xidian.edu.cn/cpp/biancheng/view/51.html
堆記憶體
數組的儲存空間必須在程式運行前申請,即數組的大小在編譯前必須是已知的常量運算式。空間申請得太大會造成浪費,空間申請得太小會造成資料溢出而使得程式異常。所以,為瞭解決這個問題,我們需要能夠在程式運行時根據實際情況申請記憶體空間。
在C++中,允許我們在程式運行時根據自己的需要申請一定的記憶體空間,我們把它稱為堆記憶體(Heap)空間。
申請堆記憶體
new 資料類型[運算式];
其中,運算式可以是一個整型正常量,也可以是一個有確定值的整型正變數,其作用類似聲明數組時的元素個數,所以兩旁的中括弧不可省略。如果我們只申請一個變數的空間,則該運算式可以被省略,即寫作: new 資料類型;
釋放堆記憶體
當一個程式運行完畢之後,它所使用的資料就不再需要。由於記憶體是有限的,所以它原來佔據的記憶體空間也應該釋放給別的程式使用。對於普通變數和數組,在程式結束運行以後,系統會自動將它們的空間回收。然而對於我們自己分配的堆記憶體空間,大多數系統都不會將它們回收。如果我們不人為地對它們進行回收,只“借”不“還”,那麼系統資源就會枯竭,電腦的運行速度就會越來越慢,直至整個系統崩潰。我們把這種只申請空間不釋放空間的情況稱為記憶體泄露(Memory Leak)。
確認申請的堆記憶體空間不再使用後,我們用delete操作符來釋放堆記憶體空間,其文法格式為: delete [] 指向堆記憶體首元素的指標;
如果申請的是一個堆記憶體變數,則delete後的[]可以省略;如果申請的是一個堆記憶體數組,則該[]不能省略,否則還是會出現記憶體泄露。另外,我們也不難發現,delete後的指標就是通過new獲得的指標,如果該指標的資料被修改或丟失,也可能造成記憶體泄露。
執行個體
#include "iostream.h"int main(){ int size; float sum=0; int *heapArray; cout <<"請輸入元素個數:"; cin >>size; heapArray=new int[size]; cout <<"請輸入各元素:" <<endl; for (int i=0;i<size;i++) { cin >>heapArray[i]; sum=sum+heapArray[i]; } cout <<"這些數的平均值為" <<sum/size <<endl; delete [] heapArray; return 0;}
可見,申請的堆記憶體數組在使用上和一般的數組並無差異。我們需要記住的是,申請了資源用完了就一定要釋放,這是程式員的好習慣,也是一種責任。