C++內存分配與釋放


  通常定義變量或者對象,編譯器在編譯時都可以根據該變量或對象的類型知道所需內存空間的大小,從而系統在適當的時候為他們分配確定的存儲空間,這種內存分配被稱為靜態存儲分配

  有些操作對象只有在程序運行時才能確定,這樣編譯器在編譯時就無法為他們預定存儲空間,只能在程序運行時,系統根據運行時的要求進行內存分配,這種方法稱為動態內存分配

  所有動態存儲分配都在堆區中進行。

內存的分配與釋放
  當程序運行到需要一個動態分配的變量或對象,必須向系統申請取得堆中的一塊所需大小的存儲空間,用於存儲該變量或對象。當不再使用該變量或對象時,也就是它生命結束之時,要顯式釋放它所占用的存儲空間,這樣系統就能對該堆空間進行再分配,做到重復使用有限資源。

  在C++中,申請和釋放堆中分配的存儲空間,分別使用newdelete的兩個運算符來完成,使用格式如下:
  指針變量名 = new 類型名(初始化式)
    delete指針名 
  new運算符返回的是一個指向所分配類型變量(對象)的指針。對所創建的變量或對象,都是通過該指針來間接操作的,而動態創建的對象本身沒有名字。

#include<iostream>
using namespace std;
class ST
{
private:
    int a;
public:
    ST(int _a=0):a(_a)
    {
        this->a = _a;
        cout<<"Object was built. "<<endl;
    }
    ~ST()
    {
        cout<<"Object was free. "<<endl;
    }
};
void malloc_free()
{
    ST *tmp = (ST*)malloc(sizeof(ST));
    free(tmp);
}
void new_delete()
{
    ST *tmp = new ST[1];//但是new為對象數組分配空間不可初始化
    delete []tmp;
}
void main()
{
    ST *pt = new ST(1);//new為對象分配空間就可初始化
    delete [] pt;//delete p 是刪除pt所指空間,而並非刪除pt,為了預防野指針可將pt=NUll
    malloc_free();
    new_delete();
}

 運行結果

malloc&free,new&delete都是申請釋放空間,但是,有如下幾點不同

1.new申請時不需要強制轉換類型,也不需要申請結束后判斷是否申請到(因為其內部含有未申請到異常退出)

2.new在為某個對象申請空間時,會調用構造函數,因此可在申請時初始化(對象的構造函數要支持),delete也會在釋放空間時會先調用析構函數

3.由堆區創建對象數組(例如ST*pt = new ST[10]),只能調用缺省的構造函數缺省構造函數:不含參數的或每個參數都有默認值的構造函數),不能調用其他任何構     造函數。若沒有缺省的構造函數則不能創建對象數組。還有,創建對象數組時不可以初始化

4.對數組進行動態分配格式如下:
 指針變量名 = new 類型名[下標表達式]

 (下標表達式不是常量表達式,可不必再編譯時確定)
 
delete []指向該數組的指針變量名
 這兩者必須搭配使用,若delete未加[],編譯器會認為該指針是指向數組的第一個元素的指針,僅僅回收第一個元素所占空間。加上[]則會回收整個數組。


免責聲明!

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



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