new和delete是C++新引入的單目運(yùn)算符,它們可以從堆上分配和刪除存儲塊(堆在C++中也叫自由存儲).用new運(yùn)算符(不是函數(shù))時要指明數(shù)據(jù)類型,以后new就分配一個足以放下指明類型對象的存儲,并返回該存儲塊的首地址作為指向指定類型的指針.
1. new/new[]:完成兩件事,先底層調(diào)用malloc分了配內(nèi)存,然后創(chuàng)建一個對象(調(diào)用構(gòu)造函數(shù))。
2. delete/delete[]:也完成兩件事,先調(diào)用析構(gòu)函數(shù)(清理資源),然后底層調(diào)用free釋放空間。
3. new在申請內(nèi)存時會自動計算所需字節(jié)數(shù),而malloc則需我們自己輸入申請內(nèi)存空間的字節(jié)數(shù)。
new/delete,new[]/delete[],malloc/free必須配對使用。
在此假設(shè)我們已經(jīng)創(chuàng)建了一個data類,以下是new/delete,delete/delete[]底層實現(xiàn)機(jī)制。

常見的new與delete錯誤解析:
//data *p = newdata;
//delete p;//標(biāo)準(zhǔn)用法,調(diào)用析構(gòu)函數(shù)之后并釋放了所申請的內(nèi)存空間
//free(p);//不提倡,雖然可以釋放,但是沒調(diào)用析構(gòu)函數(shù)
//delete[]p;錯誤,程序崩潰,因為delete釋放空間是從new出來的空間真正起始地址處(new出來返回的指正變量p并不是在空間的真正起始處,而是在真正起始處偏移若干字節(jié)處)而釋放時,在new出來的空間正真起始處開始釋放,釋放的空間超過了原來p所指向的地址處,所以程序會崩潰*/
//data *p1 = newdata[2];
//delete p1;//若顯式給出了析構(gòu)函數(shù),則錯誤,創(chuàng)建了兩個對象的存儲空間,而只釋放了一個,內(nèi)存泄漏,若沒有顯式析構(gòu)函數(shù),則能編譯通過(不提倡)
//free(p1);//錯誤,程序直接崩潰,沒掉析構(gòu)函數(shù),而且分配的內(nèi)存與釋放的內(nèi)存不匹配
//delete[]p1;//正確,必須配對使用假設(shè)
Sizeof(data/data[2]):
假設(shè)data類對象大小為12字節(jié),若顯式定義了析構(gòu)函數(shù),則new data[2]大小為28字節(jié),則會多申請4字節(jié)的空間保存deta類對象的個數(shù)(count=2),若沒有顯式定義析構(gòu)函數(shù),則new data[2]大小24字節(jié)。
新聞熱點
疑難解答