malloc/free和new/delete的筆記

相同點(diǎn):都可用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存随闪。

不同點(diǎn):
(1)操作對(duì)象有所不同搀崭。
malloc與free是C++/C 語言的標(biāo)準(zhǔn)庫函數(shù)捻浦,new/delete 是C++的運(yùn)算符粗卜。對(duì)于非內(nèi)部數(shù)據(jù)類的對(duì)象而言屋确,光用maloc/free 無法滿足動(dòng)態(tài)對(duì)象的要求。對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù), 對(duì)象消亡之前要自動(dòng)執(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刨啸。
(2)用法上也有所不同堡赔。
函數(shù)malloc 的原型如下:void *malloc(size_t size);用malloc 申請(qǐ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)存的容量事先都是知道的袍冷,語句free(p)能正確地釋放內(nèi)存。如果p 是NULL 指針猫牡,那么free對(duì)p 無論操作多少次都不會(huì)出問題胡诗。如果p 不是NULL 指針,那么free 對(duì)p連續(xù)操作兩次就會(huì)導(dǎo)致程序運(yùn)行錯(cuò)誤淌友。
new/delete 的使用要點(diǎn):運(yùn)算符new 使用起來要比函數(shù)malloc 簡單得多煌恢,例如: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 的語句也可以有多種形式拨拓。如果用new 創(chuàng)建對(duì)象數(shù)組肴颊,那么只能使用對(duì)象的無參數(shù)構(gòu)造函數(shù)。
例如Obj *objects = new Obj[100]渣磷; // 創(chuàng)建100 個(gè)動(dòng)態(tài)對(duì)象
不能寫成Obj *objects = new Obj[100](1); // 創(chuàng)建100 個(gè)動(dòng)態(tài)對(duì)象的同時(shí)賦初值1
在用delete 釋放對(duì)象數(shù)組時(shí)苫昌,留意不要丟了符號(hào)‘[]’。
例如delete []objects;// 正確的用法
delete objects祟身;// 錯(cuò)誤的用法
后者相當(dāng)于delete objects[0]奥务,漏掉了另外99 個(gè)對(duì)象。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1袜硫、new自動(dòng)計(jì)算需要分配的空間氯葬,而malloc需要手工計(jì)算字節(jié)數(shù)
2、new是類型安全的婉陷,而malloc不是帚称,
比如:int* p = new float[2]; // 編譯時(shí)指出錯(cuò)誤
int* p = malloc(2*sizeof(float)); // 編譯時(shí)無法指出錯(cuò)誤 new operator 由兩步構(gòu)成,分別是 operator new 和 construct
3秽澳、operator new對(duì)應(yīng)于malloc闯睹,但operator new可以重載,可以自定義內(nèi)存分配策略担神,甚至不做內(nèi)存分配楼吃,甚至分配到非內(nèi)存設(shè)備上。而malloc無能為力
4妄讯、new將調(diào)用constructor孩锡,而malloc不能;delete將調(diào)用destructor亥贸,而free不能躬窜。
5、malloc/free要庫文件支持炕置,new/delete則不要荣挨。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1、本質(zhì)區(qū)別:malloc/free是C/C++語言的標(biāo)準(zhǔn)庫函數(shù)朴摊,new/delete是C++的運(yùn)算符一屋。對(duì)于用戶自定義的對(duì)象而言墩虹,用maloc/free無法滿足動(dòng)態(tài)管理對(duì)象的要求。對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前要自動(dòng)執(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++需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete这溅。

2组民、聯(lián)系:既然new/delete的功能完全覆蓋了malloc/free,為什么C++還保留malloc/free呢悲靴?
因?yàn)镃++程序經(jīng)常要調(diào)用C函數(shù)臭胜,而C程序只能用malloc/free管理動(dòng)態(tài)內(nèi)存。如果用free釋放“new創(chuàng)建的動(dòng)態(tài)對(duì)象”,那么該對(duì)象因無法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯(cuò)耸三。如果用delete釋放“malloc申請(qǐng)的動(dòng)態(tài)內(nèi)存”乱陡,理論上講程序不會(huì)出錯(cuò),但是該程序的可讀性很差仪壮。所以new/delete憨颠、malloc/free必須配對(duì)使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末积锅,一起剝皮案震驚了整個(gè)濱河市爽彤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缚陷,老刑警劉巖适篙,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異箫爷,居然都是意外死亡嚷节,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蝶缀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丹喻,“玉大人薄货,你說我怎么就攤上這事翁都。” “怎么了谅猾?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵柄慰,是天一觀的道長。 經(jīng)常有香客問我税娜,道長坐搔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任敬矩,我火速辦了婚禮概行,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弧岳。我一直安慰自己凳忙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布禽炬。 她就那樣靜靜地躺著涧卵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腹尖。 梳的紋絲不亂的頭發(fā)上柳恐,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼乐设。 笑死讼庇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的近尚。 我是一名探鬼主播巫俺,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肿男!你這毒婦竟也來了介汹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤舶沛,失蹤者是張志新(化名)和其女友劉穎嘹承,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體如庭,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叹卷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坪它。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骤竹。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖往毡,靈堂內(nèi)的尸體忽然破棺而出蒙揣,到底是詐尸還是另有隱情,我是刑警寧澤开瞭,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布懒震,位于F島的核電站,受9級(jí)特大地震影響嗤详,放射性物質(zhì)發(fā)生泄漏个扰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一葱色、第九天 我趴在偏房一處隱蔽的房頂上張望递宅。 院中可真熱鬧,春花似錦苍狰、人聲如沸办龄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽土榴。三九已至,卻和暖如春响牛,著一層夾襖步出監(jiān)牢的瞬間玷禽,已是汗流浹背赫段。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矢赁,地道東北人糯笙。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像撩银,于是被迫代替她去往敵國和親给涕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容