• <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 閱讀(804) 評(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ì)使用。

            国产精品成人久久久久久久| 亚洲午夜久久久久久久久电影网| 久久亚洲精精品中文字幕| 亚洲欧洲久久久精品| 久久九九兔免费精品6| 久久精品国产91久久综合麻豆自制| 国产成人精品久久亚洲高清不卡 | 99久久国产综合精品女同图片| 久久久久久伊人高潮影院| 精品久久久无码人妻中文字幕豆芽| 久久国产精品免费| 久久66热人妻偷产精品9| 国产精品永久久久久久久久久| 国产成人精品久久| 久久久WWW免费人成精品| 亚洲精品乱码久久久久久中文字幕| 国产精品亚洲综合专区片高清久久久| 综合久久国产九一剧情麻豆 | 中文字幕乱码久久午夜| 热re99久久精品国产99热| 精品久久久无码21p发布| 久久久久国产一区二区三区| 久久综合给久久狠狠97色| 久久久久久精品免费免费自慰| 国产精品综合久久第一页| 久久久噜噜噜www成人网| 尹人香蕉久久99天天拍| 久久亚洲精品无码观看不卡| 久久99国产一区二区三区| 国产精品视频久久| 国产精品99久久免费观看| 色综合久久综合中文综合网| 久久人人爽人人爽人人片AV不 | 国产精品福利一区二区久久| 久久婷婷五月综合国产尤物app | 久久久精品人妻无码专区不卡 | 久久播电影网| 香蕉久久一区二区不卡无毒影院| 国产韩国精品一区二区三区久久| 久久成人精品视频| 国产精品无码久久久久|