一。 new/delete 與 malloc/free 的區(qū)別
1。new自動計算需要分配的空間,而malloc需要手工計算字節(jié)數(shù)
2。new是類型安全的,而malloc不是,比如:
int* p = new float[2]; // 編譯時指出錯誤
int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤
------ 以上兩點只是改進,但以下兩點malloc就無能為力了
new operator 由兩步構(gòu)成,分別是 operator new 和 construct
3。 operator new對應(yīng)于malloc,但operator new可以重載,可以自定義內(nèi)存分配策略,甚至不做內(nèi)存分配,甚至分配到非內(nèi)存設(shè)備上。而malloc無能為力
4。 new將調(diào)用constructor,而malloc不能;delete將調(diào)用destructor,而free不能。
通常 new 時干兩件事,a. 為對應(yīng)變量(或數(shù)組)分配內(nèi)存。b. 調(diào)用相關(guān)構(gòu)造函數(shù)。而 malloc() 只是為對應(yīng)變量(或數(shù)組)分配內(nèi)存。而且當(dāng)失敗時表現(xiàn)不一樣,malloc 失敗返回 NULL,而 new 失敗拋出異常,用返回值判斷 malloc 是否成功絕對正確,而用返回的值判斷是否是 NULL 來判斷對應(yīng) new 是否成功不是總是可靠(標準未規(guī)定)。
對應(yīng)于 new 干的 delete 時也是干兩件事 a. 調(diào)用對應(yīng)對象的析構(gòu)方法,b. 釋放對應(yīng)變量占用內(nèi)存,free 只是釋放對應(yīng)的內(nèi)存。
在 C++ 中可以重載 new 和 delete 操作符號(全局的或類自己的),而 malloc、free 無法重載。
new ,delete是c++對malloc,free的擴展?;究梢赃@樣理解:
new 相當(dāng)于:
T *ptr = (T) malloc( sizeof(T) ); //申請沒有初始化的內(nèi)存
ptr->T::T(); //調(diào)用構(gòu)造函數(shù)初始化這塊內(nèi)存
delete 相當(dāng)于:
ptr->T::~T(); //調(diào)用析構(gòu)函數(shù)
free(ptr);//釋放這塊內(nèi)存
二。指針和引用的區(qū)別
1.從現(xiàn)象上看:指針在運行時可以改變其所指向的值,而引用一旦和某個對象綁定后就不再改變
2.從內(nèi)存分配上看:程序為指針變量分配內(nèi)存區(qū)域,而引用不分配內(nèi)存區(qū)域
3.從編譯上看:程序在編譯時分別將指針和引用添加到符號表上,符號表上記錄的是變量名及變量所對應(yīng)地址。指針變量在符號表上對應(yīng)的地址值為指針變量的地址值,而引用在符號表上對應(yīng)的地址值為引用對象的地址值。符號表生成后就不會再改,因此指針可以改變指向的對象(指針變量中的值可以改),而引用對象不能改。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。