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)存 收藏
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)存
對(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。 因此C++語(yǔ)言需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。注意new/delete不是庫(kù)函數(shù)。 我們先看一看malloc/free和new/delete如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理,見(jiàn)示例7-8。 class Obj{ public : Obj(void){ cout << “Initialization” << endl; } ~Obj(void){ cout << “Destroy” << endl; } void Initialize(void){ cout << “Initialization” << endl; } void Destroy(void){ cout << “Destroy” << endl; }}; void UseMallocFree(void) { Obj *a = (obj *)malloc(sizeof(obj)); // 申請(qǐng)動(dòng)態(tài)內(nèi)存 a->Initialize(); // 初始化 //… a->Destroy(); // 清除工作 free(a); // 釋放內(nèi)存} void UseNewDelete(void) { Obj *a = new Obj; // 申請(qǐng)動(dòng)態(tài)內(nèi)存并且初始化 //… delete a; // 清除并且釋放內(nèi)存} 示例7-8 用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也一樣。 全局內(nèi)存對(duì)象使用GlobalAlloc函數(shù)分配,在Windows 3.X的時(shí)代,分配的內(nèi)存可以有兩種,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的時(shí)代這些函數(shù)已經(jīng)被廢棄了, 現(xiàn)在的內(nèi)存只有一種就是虛存。在Win32中所有的進(jìn)程所使用的內(nèi)存區(qū)域是相互隔離的,每個(gè)進(jìn)程都擁有自己的地址空間。而且系統(tǒng)使用了頁(yè)面交換功能,就是 利用磁盤(pán)空間來(lái)模擬RAM,在RAM中數(shù)據(jù)不使用時(shí)將會(huì)被交換到磁盤(pán),在需要時(shí)將會(huì)被重新裝入RAM。 兩者都是在堆上分配內(nèi)存區(qū)。 malloc()是C運(yùn)行庫(kù)中的動(dòng)態(tài)內(nèi)存分配函數(shù),WINDOWS程序基本不使用了,因?yàn)樗萕INDOWS內(nèi)存分配函數(shù)少了一些特性,如,整理內(nèi)存。 GlobalAlloc()是16位WINDOWS程序使用的API,返回一個(gè)內(nèi)存句柄,在實(shí)際需要使用時(shí),用GlobalLock()來(lái)實(shí)際得到內(nèi)存 區(qū)。但,32位WINDOWS系統(tǒng)中,應(yīng)使用新的內(nèi)存分配函數(shù)HeapAlloc()以得到更好的支持,GlobalAlloc()還可以用,主要是為了 兼容。 |
|
|
來(lái)自: 昵稱5327472 > 《我的圖書(shū)館》