相同點(diǎn):它們都可以用來申請(qǐng)動(dòng)態(tài)內(nèi)存和是否內(nèi)存。
不同點(diǎn):1.malloc和free是C/C++語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new和delete是C++中的運(yùn)算符。
2.對(duì)于非內(nèi)部對(duì)象類型而言,malloc和free無(wú)法滿足要求,對(duì)象在創(chuàng)建的同時(shí)需要自動(dòng)執(zhí)行構(gòu)造函數(shù),在銷毀之前需要自動(dòng)執(zhí)行析構(gòu)函數(shù)。由于
malloc和free是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)強(qiáng)加給malloc和free。
3.函數(shù)malloc原型:
void* malloc(size_t size);
用malloc 申請(qǐng)一塊長(zhǎng)度為length 的整數(shù)類型的內(nèi)存,程序如下:int *p = (int *) malloc(sizeof(int) * length);
我們應(yīng)當(dāng)把注意力集中在兩個(gè)要素上:“類型轉(zhuǎn)換”和“sizeof”。
1. malloc 返回值的類型是void *,所以在調(diào)用malloc 時(shí)要顯式地進(jìn)行類型轉(zhuǎn)換,將void * 轉(zhuǎn)換成所需要的指針類型。
2.malloc 函數(shù)本身并不識(shí)別要申請(qǐng)的內(nèi)存是什么類型,它只關(guān)心內(nèi)存的總字節(jié)數(shù)。
函數(shù)free 的原型如下:void free( void * memblock );
為什么free
函數(shù)不象malloc 函數(shù)那樣復(fù)雜呢?這是因?yàn)橹羔榩 的類型以及它所指的內(nèi)存的容量事先都是知道的,語(yǔ)句free(p)能正確地釋放內(nèi)存。如果p
是NULL 指針,那么free對(duì)p 無(wú)論操作多少次都不會(huì)出問題。如果p 不是NULL 指針,那么free 對(duì)p連續(xù)操作兩次就會(huì)導(dǎo)致程序運(yùn)行錯(cuò)誤。
4.new/delete 的使用要點(diǎn)
運(yùn)算符new 使用起來要比函數(shù)malloc 簡(jiǎn)單得多,例如:
int *p1 = (int *)malloc(sizeof(int) * length);
int *p2 = new int[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ǔ)句也可以有多種形式。