new和delete底层解析
new和delete底層解析
2018年04月05日 10:26:44?龍躍十二?閱讀數(shù):205?標(biāo)簽:?C++newdelete?更多
個(gè)人分類:?C++
所屬專欄:?C++
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)私信博主。 https://blog.csdn.net/qq_38646470/article/details/79824464
?
- 1.new/delete 和operator new/operator delete和malloc/free的關(guān)系
- 2.new時(shí)底層處理的機(jī)制
- 3.new/delete和malloc/free的區(qū)別
?
1.new/delete 和operator new/operator delete和malloc/free的關(guān)系
先寫(xiě)個(gè)栗子看看new和delete的用法:
int main() {int *p0 = new int;int *p1 = new int(10);int *p2 = new int[10];int *p3 = (int *)malloc(sizeof(int)*10);delete p0;delete p1;delete[] p2;free(p3);return 0; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
再看看他們之間的關(guān)系:?
2.new時(shí)底層處理的機(jī)制
3.new/delete和malloc/free的區(qū)別
1)malloc/free是C/C++語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符
????malloc與free是C++/C 語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete 是C++的運(yùn)算符。對(duì)于非內(nèi)部數(shù)據(jù)類的對(duì)象而言,光用maloc/free 無(wú)法滿足動(dòng)態(tài)對(duì)象的要求。對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù), 對(duì)象消亡之前要自動(dòng)執(zhí)行析構(gòu)函數(shù)。由于malloc/free 是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加malloc/free。?
2)用法上也有所不同。
函數(shù)malloc 的原型如下:?
void * malloc(size_t size);?
● malloc 申請(qǐng)一塊長(zhǎng)度為size 個(gè)字節(jié)?
● malloc 返回值的類型是void?,所以在調(diào)用malloc 時(shí)要顯式地進(jìn)行類型轉(zhuǎn)換,將void?轉(zhuǎn)換成所需要的指針類型。?
● malloc 函數(shù)本身并不識(shí)別要申請(qǐng)的內(nèi)存是什么類型,它只關(guān)心內(nèi)存的總字節(jié)數(shù)。?
函數(shù)free 的原型如下:?
void free( void * memblock );?
● 如果p 是NULL 指針,那么free對(duì)p 無(wú)論操作多少次都不會(huì)出問(wèn)題。?
● 如果p 不是NULL 指針,那么free 對(duì)p連續(xù)操作兩次就會(huì)導(dǎo)致程序運(yùn)行錯(cuò)誤。
運(yùn)算符new 使用起來(lái)要比函數(shù)malloc 簡(jiǎn)單得多,例如:?
int?p1 = (int?)malloc(size);?
int *p2 = new int[size];?
● new 內(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ǔ)句也可以有多種形式。
在用delete 釋放對(duì)象數(shù)組時(shí),留意不要丟了符號(hào)‘[]’。例如?
● delete []p2; // 正確的用法?
● delete p2; // 錯(cuò)誤的用法?
后者相當(dāng)于delete p2[0],漏掉了另外size-1個(gè)對(duì)象。
說(shuō)來(lái)說(shuō)去我們要明白new的底層是調(diào)用malloc,delete底層調(diào)用的是free。在c++中我們使用時(shí)要明白二者的區(qū)別和聯(lián)系。在使用new時(shí)一定用delete釋放,用malloc時(shí)一定用free釋放,這樣匹配防止程序以外崩潰。
總結(jié)
以上是生活随笔為你收集整理的new和delete底层解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (*p)++和*(p++)和*p++的区
- 下一篇: 快速排序时间复杂度为O(n×log(n)