乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      malloc與free是C/C語言的標準庫函數(shù),new/delete是C的運算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存

       昵稱5327472 2011-01-07

      malloc與free是C++/C語言的標準庫函數(shù),new/delete是C++的運算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存 收藏

              malloc與free是C++/C語言的標準庫函數(shù),new/delete是C++的運算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存
              對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構造函數(shù),對象在消亡之前要自動執(zhí)行析構函 數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權限之內(nèi),不能夠把執(zhí)行構造函數(shù)和析構函數(shù)的任務強加于malloc/free。  
                因此C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以及一個能完成清理與釋放內(nèi)存工作的運算符delete。注意new/delete不是庫函數(shù)。  
        我們先看一看malloc/free和new/delete如何實現(xiàn)對象的動態(tài)內(nèi)存管理,見示例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));         //   申請動態(tài)內(nèi)存        
      a->Initialize();                                                 //   初始化         //…        
      a->Destroy();         //   清除工作        
      free(a);                 //   釋放內(nèi)存}  
        void   UseNewDelete(void)
      {         Obj     *a   =   new   Obj;         //   申請動態(tài)內(nèi)存并且初始化       
       //…         delete   a;                         //   清除并且釋放內(nèi)存}  
        示例7-8   用malloc/free和new/delete如何實現(xiàn)對象的動態(tài)內(nèi)存管理  
         
        類Obj的函數(shù)Initialize模擬了構造函數(shù)的功能,函數(shù)Destroy模擬了析構函數(shù)的功能。函數(shù)UseMallocFree中,由于 malloc/free不能執(zhí)行構造函數(shù)與析構函數(shù),必須調用成員函數(shù)Initialize和Destroy來完成初始化與清除工作。函數(shù) UseNewDelete則簡單得多。  
        所以我們不要企圖用malloc/free來完成動態(tài)對象的內(nèi)存管理,應該用new/delete。由于內(nèi)部數(shù)據(jù)類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。  
                既然new/delete的功能完全覆蓋了malloc/free,為什么C++不把malloc/free淘汰出局呢?這是因為C++程序經(jīng)常要調用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存。  
        如果用free釋放“new創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構函數(shù)而可能導致程序出錯。如果用delete釋放“malloc申請的動態(tài)內(nèi) 存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。  
        全局內(nèi)存對象使用GlobalAlloc函數(shù)分配,在Windows   3.X的時代,分配的內(nèi)存可以有兩種,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的時代這些函數(shù)已經(jīng)被廢棄了, 現(xiàn)在的內(nèi)存只有一種就是虛存。在Win32中所有的進程所使用的內(nèi)存區(qū)域是相互隔離的,每個進程都擁有自己的地址空間。而且系統(tǒng)使用了頁面交換功能,就是 利用磁盤空間來模擬RAM,在RAM中數(shù)據(jù)不使用時將會被交換到磁盤,在需要時將會被重新裝入RAM。    


      兩者都是在堆上分配內(nèi)存區(qū)。  
        malloc()是C運行庫中的動態(tài)內(nèi)存分配函數(shù),WINDOWS程序基本不使用了,因為它比WINDOWS內(nèi)存分配函數(shù)少了一些特性,如,整理內(nèi)存。  
        GlobalAlloc()是16位WINDOWS程序使用的API,返回一個內(nèi)存句柄,在實際需要使用時,用GlobalLock()來實際得到內(nèi)存 區(qū)。但,32位WINDOWS系統(tǒng)中,應使用新的內(nèi)存分配函數(shù)HeapAlloc()以得到更好的支持,GlobalAlloc()還可以用,主要是為了 兼容。

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多