• <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影片久久久久久| 久久本道伊人久久| 久久国产一区二区| 亚洲综合久久夜AV | 国产69精品久久久久777| 久久久黄片| 国产一级做a爰片久久毛片| 热久久视久久精品18| 精品多毛少妇人妻AV免费久久 | 丁香五月综合久久激情| 久久99精品久久久久久齐齐| 97精品依人久久久大香线蕉97 | 久久亚洲中文字幕精品一区| 久久人人爽人人爽人人片AV不| 久久久久国产| 亚洲一区二区三区日本久久九| 中文国产成人精品久久不卡| 国产女人aaa级久久久级| a级成人毛片久久| 亚洲女久久久噜噜噜熟女| 欧美粉嫩小泬久久久久久久 | 久久99精品久久久久久9蜜桃 | 久久天天躁狠狠躁夜夜avapp| 国产精品gz久久久| 99久久精品国产综合一区| 嫩草伊人久久精品少妇AV| 久久伊人五月丁香狠狠色| 久久久久国产一区二区| 草草久久久无码国产专区| 国产精品毛片久久久久久久| 97超级碰碰碰久久久久| 亚洲精品乱码久久久久久中文字幕| 婷婷久久五月天| 久久精品中文字幕一区| 久久久久久久精品妇女99| 久久久久久久女国产乱让韩| 久久精品国产亚洲AV不卡| 99精品久久精品一区二区| 久久夜色精品国产噜噜噜亚洲AV| 久久综合给合久久国产免费|