運(yùn)算符new使用起來(lái)要比函數(shù)malloc簡(jiǎn)單得多,例如:
int*p1=(int*)malloc(sizeof(int)*length);
int*p2=newint[length];
這是因?yàn)閚ew內(nèi)置了sizeof、類型轉(zhuǎn)換和類型安全檢查功能。對(duì)于非內(nèi)部數(shù)據(jù)類型的對(duì)象而言,new在創(chuàng)建動(dòng)態(tài)對(duì)象的同時(shí)完成了初始化工作。如果對(duì)象有多個(gè)構(gòu)造函數(shù),那么new的語(yǔ)句也可以有多種形式。
如果用new創(chuàng)建對(duì)象數(shù)組,那么只能使用對(duì)象的無(wú)參數(shù)構(gòu)造函數(shù)。例如
Obj*objects=newObj[100];創(chuàng)建100個(gè)動(dòng)態(tài)對(duì)象
不能寫成
Obj*objects=newObj[100](1);創(chuàng)建100個(gè)動(dòng)態(tài)對(duì)象的同時(shí)賦初值1
在用delete釋放對(duì)象數(shù)組時(shí),留意不要丟了符號(hào)‘[]’。例如
delete[]objects;正確的用法
deleteobjects;錯(cuò)誤的用法
后者相當(dāng)于deleteobjects[0],漏掉了另外99個(gè)對(duì)象。
1、new自動(dòng)計(jì)算需要分配的空間,而malloc需要手工計(jì)算字節(jié)數(shù)
?2、new是類型安全的,而malloc不是,比如:
?int*p=newfloat[2];編譯時(shí)指出錯(cuò)誤
?int*p=malloc(2*sizeof(float));編譯時(shí)無(wú)法指出錯(cuò)誤
?newoperator由兩步構(gòu)成,分別是operatornew和construct
?3、operatornew對(duì)應(yīng)于malloc,但operatornew可以重載,可以自定義內(nèi)存分配策略,甚至不做內(nèi)存分配,甚至分配到非內(nèi)存設(shè)備上。而malloc無(wú)能為力
?4、new將調(diào)用constructor,而malloc不能;delete將調(diào)用destructor,而free不能。
?5、mallocfree要庫(kù)文件支持,newdelete則不要。
1、本質(zhì)區(qū)別
mallocfree是CC++語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),newdelete是C++的運(yùn)算符。
對(duì)于用戶自定義的對(duì)象而言,用malocfree無(wú)法滿足動(dòng)態(tài)管理對(duì)象的要求。對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前要自動(dòng)執(zhí)行析構(gòu)函數(shù)。由于mallocfree是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于mallocfree。因此C++需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。
classObj{public:Obj(){cout"Initialization"endl;}~Obj(){cout"Destroy"endl;}voidInitialize(){cout"Initialization"endl;}voidDestroy(){cout"Destroy"endl;}}obj;voidUseMallocFree(){Obj*a=(Obj*)malloc(sizeof(obj));allocatememorya-Initialize();initialization…a-Destroy();deconstructionfree(a);releasememory}voidUseNewDelete(void){Obj*a=newObj;…deletea;}類Obj的函數(shù)Initialize實(shí)現(xiàn)了構(gòu)造函數(shù)的功能,函數(shù)Destroy實(shí)現(xiàn)了析構(gòu)函數(shù)的功能。函數(shù)UseMallocFree中,由于mallocfree不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來(lái)完成“構(gòu)造”與“析構(gòu)”。所以我們不要用mallocfree來(lái)完成動(dòng)態(tài)對(duì)象的內(nèi)存管理,應(yīng)該用newdelete。由于內(nèi)部數(shù)據(jù)類型的“對(duì)象”沒(méi)有構(gòu)造與析構(gòu)的過(guò)程,對(duì)它們而言mallocfree和newdelete是等價(jià)的。
2、聯(lián)系
既然newdelete的功能完全覆蓋了mallocfree,為什么C++還保留mallocfree呢?因?yàn)镃++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用mallocfree管理動(dòng)態(tài)內(nèi)存。如果用free釋放“new創(chuàng)建的動(dòng)態(tài)對(duì)象”,那么該對(duì)象因無(wú)法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯(cuò)。如果用delete釋放“malloc申請(qǐng)的動(dòng)態(tài)內(nèi)存”,理論上講程序不會(huì)出錯(cuò),但是該程序的可讀性很差。所以newdelete、mallocfree必須配對(duì)使用。
信息發(fā)布:廣州名易軟件有限公司 http://m.jetlc.com