• <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的區(qū)別

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

            由于編程的習(xí)慣,動(dòng)態(tài)管理內(nèi)存的時(shí)候總是用new/delete,malloc/free很少使用,兩者之間的區(qū)別就不是很清楚了。

            1. 本質(zhì)區(qū)別
            malloc/free是C/C++語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符。
            對(duì)于用戶自定義的對(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++需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符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的函數(shù)Initialize實(shí)現(xiàn)了構(gòu)造函數(shù)的功能,函數(shù)Destroy實(shí)現(xiàn)了析構(gòu)函數(shù)的功能。函數(shù)UseMallocFree中,由于malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來(lái)完成“構(gòu)造”與“析構(gòu)”。所以我們不要用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à)的。

            2. 聯(lián)系
            既然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,malloc/free必須配對(duì)使用。

            国产精品久久久久久五月尺| 久久福利片| 国产成人久久精品一区二区三区| 香蕉久久夜色精品升级完成 | 久久精品国产亚洲av麻豆小说 | 亚洲午夜久久久久久噜噜噜| 一级做a爰片久久毛片毛片| 欧美亚洲另类久久综合婷婷| 久久亚洲精品国产亚洲老地址| 亚洲精品乱码久久久久久按摩 | 国产精品久久永久免费| 欧美大战日韩91综合一区婷婷久久青草 | 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 国内精品久久久久影院网站| 伊人久久精品无码二区麻豆| 久久久久久毛片免费看| 久久99精品国产自在现线小黄鸭 | 久久综合九色综合97_久久久| 中文字幕久久精品| 久久婷婷五月综合成人D啪| 久久久久综合网久久| 亚洲国产精品成人久久| 亚洲国产成人久久一区WWW| 国内精品久久久久久久coent| www.久久精品| 欧美亚洲国产精品久久蜜芽| 国产午夜免费高清久久影院| 麻豆一区二区99久久久久| 久久综合亚洲色一区二区三区| 久久亚洲高清综合| 人人狠狠综合久久亚洲| 久久久久亚洲精品无码网址| 精品久久久久久国产牛牛app| 天天爽天天爽天天片a久久网| 99999久久久久久亚洲| 久久久久综合网久久| 久久伊人精品青青草原高清| 66精品综合久久久久久久| 精品乱码久久久久久夜夜嗨| 久久婷婷五月综合色99啪ak| 伊人久久大香线蕉成人|