1,malloc與free是C++/C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符,。它們都可用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存 2,對(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,。 3,因此C++語(yǔ)言需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete,。注意new/delete不是庫(kù)函數(shù),。 4,C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動(dòng)態(tài)內(nèi)存,。 5,、new可以認(rèn)為是malloc加構(gòu)造函數(shù)的執(zhí)行。new出來(lái)的指針是直接帶類型信息的,。而malloc返回的都是void指針,。
CPP代碼
示例用malloc/free和new/delete如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理 類Obj的函數(shù)Initialize模擬了構(gòu)造函數(shù)的功能,函數(shù)Destroy模擬了析構(gòu)函數(shù)的功能,。函數(shù)UseMallocFree中,,由于malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來(lái)完成初始化與清除工作,。函數(shù)UseNewDelete則簡(jiǎn)單得多,。 所以我們不要企圖用malloc/free來(lái)完成動(dòng)態(tài)對(duì)象的內(nèi)存管理,應(yīng)該用new/delete,。由于內(nèi)部數(shù)據(jù)類型的“對(duì)象”沒(méi)有構(gòu)造與析構(gòu)的過(guò)程,,對(duì)它們而言malloc/free和new/delete是等價(jià)的。 既然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ì)象因無(wú)法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯(cuò),。如果用delete釋放“malloc申請(qǐng)的動(dòng)態(tài)內(nèi)存”,理論上講程序不會(huì)出錯(cuò),,但是該程序的可讀性很差,。所以new/delete必須配對(duì)使用,malloc/free也一樣,。 二:new delete在實(shí)現(xiàn)上其實(shí)調(diào)用了malloc,free函數(shù),。 三:new operator除了分配內(nèi)存,還要調(diào)用構(gòu)造函數(shù),。 malloc函數(shù)只是負(fù)責(zé)分配內(nèi)存 |
|
來(lái)自: wlk8611 > 《C 基礎(chǔ)》