小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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)存

 昵稱5327472 2011-01-07

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()還可以用,主要是為了 兼容。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多