C++堆記憶體空間詳解

來源:互聯網
上載者:User

原文: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;}

可見,申請的堆記憶體數組在使用上和一般的數組並無差異。我們需要記住的是,申請了資源用完了就一定要釋放,這是程式員的好習慣,也是一種責任。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.