關於VC/MFC中內存管理、堆、堆棧概念理解收集的幾點說明

MSDN中的說明:

-----------------------------------------

堆是爲程序的內存分配需要而保留的。它是程序代碼和堆棧以外的區域。典型的 C 程序使用 mallocfree 函數分配和釋放堆內存。MFC 的調試版本提供修改版本的 C++ 內置運算符 newdelete,以分配和解除分配堆內存中的對象。

使用 newdelete 而不是 mallocfree 時,可以利用類庫的內存管理調試增強功能,此增強功能對於檢測內存泄漏可能有用。使用 MFC 的發佈版本生成程序時,newdelete 運算符的標準版本提供分配和釋放內存的有效方式(MFC 的發佈版本不提供這些運算符的修改版本)。

請注意,在堆上分配的對象的總大小隻受系統可用虛擬內存的限制。

-----------------------------------------

在Window中執行的每一個應用程序都有其自己的內存地址。一部分內存空間用於存放程序代碼,一部分內存空間用於存放程序執行期間   創建的變量。創將變量的方法有兩種,一種是在堆中,另外一種則在堆棧裏。   
     

理解堆的最好的方法是將它看成一個程序隨時可以使用的內存塊。爲了創建堆變量,程序要使用“new”(在C++裏)操作符或者malloc”(在C中)例程,它們返回指向變量的指針(堆變量總是通過指針來處理和操作)。最後程序用“delete”(在C++裏)操作符或者“free”(在C中)例程來刪除或者釋放內存空間。而堆棧則不同,它是某個函數被調用後隨時可以創建的一小塊內存,被用於在函數範圍內保存變量(也稱爲自動變量)。在函數中,任何包含在{}內的代碼都有其自己的堆棧。當這個函數或者{}退出時,堆棧以及它包含的所有內容都被摧毀。因此下面的代碼是不運行的:  
  
  void Myfunction()  
  {  
        int i=5;  
        {  
           int j=6;  
        }  
        int k=i+j;  
  }   

 

所以本文問題的答案是:使用堆棧(stack)分配本地或者局域變量的地址空間,而用堆(heap)分配大塊內存地址或者動態創建對象的情形。例如:  
   
  void MyFunction()  
  {  
        int i=5;                           // 堆棧中的本地(自動)變量  
        int *iArray;                      // 堆棧中的本地(自動)變量  
        iArray = new int[10000];    // 這一行代碼將在堆中創建10000個元素的數組,由iArray指向其地址  
        for(int k=0; k<10000; k++)  
        {  
             iArray[k] = k+i;  
             cout<< iArray[k] << "/n";  
        }  
        delete iArray;                   // 從堆中刪除或釋放數組佔用的地址空間,否則將會有內存泄漏  
  }                                         //  函數結束   
    

注意:iArray 不是一個堆變量。它是一個局部指針變量,指向堆中未命名的一個數組.

 

  

 


自己做的的小站,喜歡網絡小說、喜歡讀書的朋友歡迎來轉一轉
小說夜讀

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章