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

            久久久久人妻一区精品色| 狠狠久久综合伊人不卡| 亚洲精品乱码久久久久久蜜桃图片 | 四虎久久影院| 亚洲va中文字幕无码久久不卡| 国产精品禁18久久久夂久| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 精品久久久久中文字幕一区| 亚洲国产成人精品91久久久 | 久久久久99精品成人片三人毛片 | 国产成人精品久久一区二区三区 | 狠狠色狠狠色综合久久| 久久综合狠狠色综合伊人| 一本综合久久国产二区| 久久99免费视频| 亚洲AV日韩精品久久久久久| 99国内精品久久久久久久 | 免费无码国产欧美久久18| 国产精品一区二区久久| 伊人久久大香线蕉综合5g| 99久久精品国产综合一区| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 综合久久一区二区三区| 亚洲一区二区三区日本久久九| 日韩人妻无码一区二区三区久久| 久久综合日本熟妇| 国产精品99久久不卡| 国产一级做a爰片久久毛片| 人妻久久久一区二区三区| 久久中文字幕精品| 中文精品久久久久人妻不卡| 国产精品无码久久综合网| 色综合久久久久网| 亚洲国产精品久久久久婷婷软件| 午夜精品久久久久久99热| 久久人人爽人人人人爽AV| 99久久做夜夜爱天天做精品| 亚洲成av人片不卡无码久久| 综合久久一区二区三区 | 97久久精品人人做人人爽| 99久久综合国产精品二区|