• <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必須配對使用。

            久久久久久噜噜精品免费直播| 午夜天堂精品久久久久| 亚洲一本综合久久| 日本精品久久久久影院日本| 7777精品伊人久久久大香线蕉| 热re99久久6国产精品免费| 老司机国内精品久久久久| 亚洲人成无码久久电影网站| 99久久成人国产精品免费| 久久久久国产| 亚洲一区中文字幕久久| 亚洲AV无码久久| 老男人久久青草av高清| 久久久久久毛片免费看| 中文字幕亚洲综合久久2| 久久免费的精品国产V∧| 久久影院久久香蕉国产线看观看| 久久99热只有频精品8| 欧美国产成人久久精品| 欧美一级久久久久久久大| 狠狠狠色丁香婷婷综合久久五月 | 国产69精品久久久久久人妻精品| 精品久久香蕉国产线看观看亚洲| 久久精品视频一| 狠狠色丁香婷婷久久综合五月| 精品久久久久久久久久中文字幕 | 国产激情久久久久影院老熟女免费| 人妻久久久一区二区三区| 亚洲精品午夜国产VA久久成人| 久久久久这里只有精品 | 久久国产精品久久久| 日产精品久久久久久久性色| 久久久亚洲AV波多野结衣| 综合久久给合久久狠狠狠97色| 欧洲性大片xxxxx久久久| 久久精品一区二区影院| 久久国产一片免费观看| 日韩欧美亚洲国产精品字幕久久久 | 国产精品久久久久久| 九九久久99综合一区二区| 久久久久一区二区三区|