C++動態內存和類



C++中new可以動態分配內存,這和C語言中malloc的作用類似。但不同的是new創建類的時侯會自動調用構造函數,而malloc則不會。

 因此C++中一般使用new來進行動態分配內存,與malloc一樣用new分配的內存可以需要釋放,但並不是使用free來釋放,而是使用delete來釋放。同樣delete會自動調用析構函數,而free則不會。

C++中new可以動態分配內存,這和C語言中malloc的作用類似。但不同的是new創建類的時侯會自動調用構造函數,而malloc則不會。

因此C++中一般使用new來進行動態分配內存,與malloc一樣用new分配的內存可以需要釋放,但並不是使用free來釋放,而是使用delete來釋放。同樣delete會自動調用析構函數,而free則不會

new的具體使用方式如下:

類型 *變量名 = new 類型;

delete 變量 / delete[] 變量;

類型包括數組、結構體和類等等

數組申請動態內存後,要使用delete[]才能把內存清除乾淨,另外使用delete後指針並不會杯清空,因此應該複製爲NULL,來防止野指針的出現。


point *ptr1=new point;   //定義的一個指針,並且讓指針指向一個內存空間
delete prt1             //回收了指針所指向的內存空間,指針仍然存在
ptr1= new point(1,2)    //再次讓指針指向一個新申請內存空間 


C++自動提供了五種成員函數:默認構造函數(如果沒有定義構造函數),複製構造函數(如果沒有定義),賦值操作符(如果沒有定義),默認析構函數(如果沒有定義),地址操作符(如果沒有定義)。

默認構造函數:如果程序沒有提供任何構造函數,那麼編譯器將提供一個不帶任何操作、不接收任何參數的構造函數,因爲創建對象時總會用到構造函數。如果定義了構造函數,C++將不會用到定義默認構造函數。

複製構造函數:複製構造函數用於將一個對象複製到新創建的對象中,也就是用於初始化而不是常規賦值過程中,它的原型通常如下:class_name(const class_name &)。那麼什麼時候調用複製構造函數呢?新建一個對象並將其初始化爲同類現有對象時,都會調用複製構造函數。將函數按值傳遞或者函數返回對象時,也會調用複製構造函數。默認的複製構造函數會逐個複製非靜態成員變量,複製的是成員的值

如果類中包含了使用new初始化的指針成員,應當定義一個複製構造函數,以複製指向的數據,而不是指針,這被稱爲深度複製。複製的另外一種形式是隻複製指針值。

賦值操作符:C++允許通過自動類重載賦值操作符實現對象賦值,這種操作符的原型如下:Class_name & Class_name::operator = (const Class_name &),它接受並返回一個指向類對象的引用。

在構造函數中使用new來初始化指針成員,則應在析構函數中使用delete,如果有多個構造函數,則必須以相同的方式使用new,要麼都帶中括號,要麼都不帶,有一個例外,就是在構造函數中使用new初始化指針函數,而在另外一個構造函數中將指針初始化爲空,delete可以用於空指針。


賦值操作符的重載,此操作符只能在類的方法中重載,以實現深度拷貝
StringBad & StringBad::operator = (const StringBad & st)
{
     if(this==&st)
        return *this;
     len=st.len;
     delete[] str; //將此前創建的空間釋放
     str=new char[len+1];//申請新的符合大小的空間
    std::strcpy(str,st.str);
    return * this;//對原對象有更改因此不能是const返回類型
}


下面幾種情況析構函數被調用:


當對象是動態變量時,執行完定義該對象的程序塊時,將調用該對象的析構函數。

當對象是靜態變量時,程序結束時將調用對象的析構函數。

當對象是用new創建的時,僅當顯示使用delete刪除對象時,析構函數纔會被調用。


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