• <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ì)使用。

            久久99精品久久久久久动态图 | 亚洲国产成人久久精品影视| 久久国产精品一国产精品金尊| 国产Av激情久久无码天堂| 国产精品久久国产精品99盘 | 欧美麻豆久久久久久中文| 亚洲国产精品久久久久婷婷软件| 久久久久久A亚洲欧洲AV冫| 久久人与动人物a级毛片| avtt天堂网久久精品| 亚洲精品国精品久久99热| 2021精品国产综合久久| 午夜福利91久久福利| 91精品国产综合久久久久久| 亚洲国产精品一区二区三区久久| 国产精品久久久久久久久| 人妻少妇精品久久| 色噜噜狠狠先锋影音久久| 狠狠色噜噜色狠狠狠综合久久| 伊人色综合久久天天| 人妻精品久久无码专区精东影业| 国产精品99久久久久久猫咪| 人妻精品久久无码区| 一本久道久久综合狠狠躁AV| 欧美伊香蕉久久综合类网站| 无码专区久久综合久中文字幕 | 一本大道久久a久久精品综合| 久久人爽人人爽人人片AV| 无码任你躁久久久久久久| 国产精品久久久99| 伊人色综合久久| 精品久久久久久无码人妻热| 97久久超碰国产精品2021| 日韩av无码久久精品免费| 精品国产乱码久久久久久呢| 久久久这里只有精品加勒比| 亚洲欧洲中文日韩久久AV乱码| 欧美日韩中文字幕久久久不卡| 国内精品免费久久影院| 久久九九久精品国产免费直播| 久久国产视频网|