1.malloc/free是C/C++語言的標(biāo)準(zhǔn)庫函數(shù)垢乙,new/delete是C++的運(yùn)算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存语卤。但是new能夠自動分配空間大小追逮,而malloc需要計算字節(jié)數(shù)。
2.對于非內(nèi)部數(shù)據(jù)類型的對象而言粹舵,光用maloc/free無法滿足動態(tài)對象的要求钮孵。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)眼滤。由于malloc/free是庫函數(shù)而不是運(yùn)算符巴席,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free诅需。
因此C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new漾唉,以及一個能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。注意new/delete不是庫函數(shù)堰塌。---簡而言之 new/delete能進(jìn)行對對象進(jìn)行構(gòu)造和析構(gòu)函數(shù)的調(diào)用進(jìn)而對內(nèi)存進(jìn)行更加詳細(xì)的工作赵刑,而malloc/free不能。
3.new是類型安全的场刑,而malloc不是般此,比如:
int* p = new float[2]; // 編譯時指出錯誤
int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤
new operator 由兩步構(gòu)成,分別是 operator new 和 construct
4.返回值摇邦。malloc分配失敗時恤煞,返回的是空指針。1993年前施籍,c++一直要求在內(nèi)存分配失敗時operator? new要返回0居扒,現(xiàn)在則是要求operator? new拋出std::bad_alloc異常。很多c++程序是在編譯器開始支持新規(guī)范前寫的丑慎。c++標(biāo)準(zhǔn)委員會不想放棄那些已有的遵循返回0規(guī)范的代碼喜喂,所以他們提供了另外形式的operator? new(以及operator? new[])以繼續(xù)提供返回0功能。這些形式被稱為“無拋出”竿裂,因?yàn)樗麄儧]用過一個throw玉吁,而是在使用new的入口點(diǎn)采用了nothrow對象:
class?? widget?? {?? ...?? };
widget?? *pw1?? =?? new?? widget;//?? 分配失敗拋出std::bad_alloc
if?? (pw1?? ==?? 0)?? ... //?? 這個檢查一定失敗
widget?? *pw2?? =?? new?? (nothrow)?? widget;?? //?? 若分配失敗返回0
if?? (pw2?? ==?? 0)?? ... //?? 這個檢查可能會成功
聯(lián)系:
既然new/delete的功能完全覆蓋了malloc/free,為什么C++還保留malloc/free呢腻异?因?yàn)镃++程序經(jīng)常要調(diào)用C函數(shù)进副,而C程序只能用malloc/free管理動態(tài)內(nèi)存。如果用free釋放“new創(chuàng)建的動態(tài)對象”悔常,那么該對象因無法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯影斑。如果用delete釋放“malloc申請的動態(tài)內(nèi)存”给赞,理論上講程序不會出錯,但是該程序的可讀性很差矫户。所以new/delete片迅,malloc/free必須配對使用。
NULL指針皆辽、零指針柑蛇、野指針:參見此處。
參考:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/16/2593754.html
? ? ? ? ?http://blog.csdn.net/u014082714/article/details/45097875