• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            malloc/free與new/delete的區別

            Posted on 2008-08-22 09:06 阿呆@Rachel 閱讀(805) 評論(0)  編輯 收藏 引用 所屬分類: C++

            由于編程的習慣,動態管理內存的時候總是用new/delete,malloc/free很少使用,兩者之間的區別就不是很清楚了。

            1. 本質區別
            malloc/free是C/C++語言的標準庫函數,new/delete是C++的運算符。
            對于用戶自定義的對象而言,用maloc/free無法滿足動態管理對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加于malloc/free。因此C++需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。

            class Obj
            {
            public :
                  Obj(
            ) { cout << “Initialization” << endl; }
                  
            ~Obj() { cout << “Destroy” << endl; }
                  
            void Initialize() { cout << “Initialization” << endl; }
                 
            void Destroy() { cout << “Destroy” << endl; }
            };

            void UseMallocFree()
            {
                  Obj  
            *= (obj *) malloc( sizeof( obj ) );     // allocate memory
                  a->Initialize();                                                // initialization
                  
            //
                  a->Destroy();                                                // deconstruction
                  free(a);                                                           // release memory
            }

            void UseNewDelete(void)
            {
                Obj  
            *= new Obj;                                         
                
            //
                delete a;
            }


            類Obj的函數Initialize實現了構造函數的功能,函數Destroy實現了析構函數的功能。函數UseMallocFree中,由于malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy來完成“構造”與“析構”。所以我們不要用malloc/free來完成動態對象的內存管理,應該用new/delete。由于內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

            2. 聯系
            既然new/delete的功能完全覆蓋了malloc/free,為什么C++還保留malloc/free呢?因為C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。如果用free釋放“new創建的動態對象”,那么該對象因無法執行析構函數而可能導致程序出錯。如果用delete釋放“malloc申請的動態內存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete,malloc/free必須配對使用。

            久久青青草原综合伊人| 波多野结衣中文字幕久久| 99久久国产亚洲高清观看2024| 亚洲国产精品一区二区久久| 国产日韩久久久精品影院首页| 欧美日韩精品久久久免费观看| 久久精品一本到99热免费| 久久久青草久久久青草| 综合久久一区二区三区| 国产午夜久久影院| 18禁黄久久久AAA片| 99久久国产亚洲高清观看2024| 日产精品久久久久久久| 久久久久四虎国产精品| 久久久精品国产免大香伊| 久久99精品九九九久久婷婷| 欧美喷潮久久久XXXXx| 青青青青久久精品国产h久久精品五福影院1421 | 国产精品久久久久9999| 色婷婷久久久SWAG精品| 久久香蕉一级毛片| 久久久国产精品亚洲一区| 亚洲国产精品成人AV无码久久综合影院 | 欧美精品一区二区久久| 久久99中文字幕久久| 久久久久无码精品国产不卡| 亚洲婷婷国产精品电影人久久 | 亚洲精品视频久久久| 97精品伊人久久久大香线蕉| 成人妇女免费播放久久久| 久久久久久亚洲Av无码精品专口| 热久久国产欧美一区二区精品| 久久无码av三级| 99久久精品免费看国产| 久久精品成人免费看| 91精品国产综合久久久久久| 久久夜色精品国产噜噜麻豆| 精品久久久无码人妻中文字幕| 麻豆精品久久久久久久99蜜桃| 伊人热热久久原色播放www| 日本国产精品久久|