malloc一定要free嗎 為什么malloc()和free()函數(shù)會(huì)產(chǎn)生很多內(nèi)存碎片?
為什么malloc()和free()函數(shù)會(huì)產(chǎn)生很多內(nèi)存碎片?首先,碎片分為內(nèi)部碎片和外部碎片。內(nèi)部碎片是指malloc函數(shù)在塊內(nèi)部生成的信息,用于記錄當(dāng)前分配的塊在實(shí)現(xiàn)時(shí)的信息。因此,malloc之后
為什么malloc()和free()函數(shù)會(huì)產(chǎn)生很多內(nèi)存碎片?
首先,碎片分為內(nèi)部碎片和外部碎片。內(nèi)部碎片是指malloc函數(shù)在塊內(nèi)部生成的信息,用于記錄當(dāng)前分配的塊在實(shí)現(xiàn)時(shí)的信息。因此,malloc之后實(shí)際占用的內(nèi)存大小通常大于所需大小(這也與內(nèi)存對(duì)齊有一定關(guān)系)。外部碎片是我在樓上說(shuō)的。重復(fù)使用后,會(huì)在堆中產(chǎn)生不連續(xù)的可用內(nèi)存塊,即外部碎片。Malloc和free是C/C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C語(yǔ)言的操作符,它們可以應(yīng)用于動(dòng)態(tài)內(nèi)存和自由內(nèi)存。
2. 對(duì)于非內(nèi)部數(shù)據(jù)類(lèi)型的對(duì)象,僅使用malloc/free不能滿足動(dòng)態(tài)對(duì)象的要求。當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),構(gòu)造函數(shù)被自動(dòng)執(zhí)行,而在對(duì)象死亡之前,析構(gòu)函數(shù)被自動(dòng)執(zhí)行。因?yàn)閙alloc/free是一個(gè)庫(kù)函數(shù)而不是一個(gè)操作符,它不在編譯器的控制權(quán)限內(nèi),所以不能將執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加給malloc/free。
因此,C語(yǔ)言需要一個(gè)可以完成動(dòng)態(tài)內(nèi)存分配和初始化的new操作符,以及一個(gè)可以完成清理和釋放內(nèi)存的delete操作符。注意new/delete不是庫(kù)函數(shù)。
4. C程序通常調(diào)用C函數(shù),但是C程序只能使用malloc/free來(lái)管理動(dòng)態(tài)內(nèi)存。New是一個(gè)運(yùn)算符,其狀態(tài)與“”、“-”、“=”相同。。。簡(jiǎn)單來(lái)說(shuō):malloc,free是C的函數(shù),new和delete是C的另外,new是強(qiáng)制類(lèi)型,malloc不是,并且有很多區(qū)別。當(dāng)然,new可以在聲明時(shí)調(diào)用構(gòu)造函數(shù)來(lái)初始化malloc。Malloc只分配空間,需要在其他地方初始化。Delete不僅釋放空間,而且在釋放前調(diào)用析構(gòu)函數(shù)。Malloc需要指定分配空間的大小,new將自動(dòng)計(jì)算