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刪除對象時,析構函數纔會被調用。