• <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>

            life02

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 0 Trackbacks
            malloc/free和new/delete的區(qū)別
            2009年08月18日 星期二 11:26

            有了malloc/free為什么還要new/delete ?
                    malloc與free是C++/C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符。它們都可用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。

            對(duì)于非內(nèi)部數(shù)據(jù)類(lèi)型的對(duì)象而言,光用maloc/free無(wú)法滿(mǎn)足動(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++語(yǔ)言需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。注意new/delete不是庫(kù)函數(shù)。

            我們先看一看malloc/free和new/delete如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理,見(jiàn)示例7-8。



            class Obj

            {

            public :

                     Obj(void){ cout << “Initialization” << endl; }

            ~Obj(void){ cout << “Destroy” << endl; }

            void     Initialize(void){ cout << “Initialization” << endl; }

            void     Destroy(void){ cout << “Destroy” << endl; }

            };

            void UseMallocFree(void)

            {

                 Obj   *a = (obj *)malloc(sizeof(obj));    // 申請(qǐng)動(dòng)態(tài)內(nèi)存

                 a->Initialize();                         // 初始化

                 //…

                 a->Destroy();    // 清除工作

                 free(a);         // 釋放內(nèi)存

            }

            void UseNewDelete(void)

            {

                 Obj   *a = new Obj;   // 申請(qǐng)動(dòng)態(tài)內(nèi)存并且初始化

                 //…

                 delete a;            // 清除并且釋放內(nèi)存

            }


            示例7-8 用malloc/free和new/delete如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理



            類(lèi)Obj的函數(shù)Initialize模擬了構(gòu)造函數(shù)的功能,函數(shù)Destroy模擬了析構(gòu)函數(shù)的功能。函數(shù)UseMallocFree中,由于malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來(lái)完成初始化與清除工作。函數(shù)UseNewDelete則簡(jiǎn)單得多。

            所以我們不要企圖用malloc/free來(lái)完成動(dòng)態(tài)對(duì)象的內(nèi)存管理,應(yīng)該用new/delete。由于內(nèi)部數(shù)據(jù)類(lèi)型的“對(duì)象”沒(méi)有構(gòu)造與析構(gòu)的過(guò)程,對(duì)它們而言malloc/free和new/delete是等價(jià)的。

                 既然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必須配對(duì)使用,malloc/free也一樣。

            posted on 2009-10-09 13:01 life02 閱讀(295) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): c++學(xué)習(xí)
            99久久国产宗和精品1上映| 日韩精品久久久久久免费| 熟妇人妻久久中文字幕| 日韩久久无码免费毛片软件| 国内精品久久久久久久久| 免费观看成人久久网免费观看| 精品久久久久久无码专区| 久久精品青青草原伊人| 久久久久久久波多野结衣高潮| 久久免费视频1| 久久香蕉超碰97国产精品| 亚洲伊人久久精品影院| 久久亚洲精品无码AV红樱桃| 狠狠色婷婷久久一区二区三区| 午夜人妻久久久久久久久| 久久国产亚洲高清观看| 久久久久成人精品无码中文字幕| 少妇人妻88久久中文字幕| 国产精品美女久久久久久2018| 精品国产一区二区三区久久| 国产精品久久国产精品99盘 | 99久久夜色精品国产网站| 大香网伊人久久综合网2020| 国内精品久久久久久中文字幕| 色99久久久久高潮综合影院| 久久精品视频一| 国产精品久久毛片完整版| 青青青伊人色综合久久| 亚洲国产精品无码久久青草 | 亚洲综合精品香蕉久久网| 久久精品一本到99热免费| 国产精品成人久久久久久久| 亚洲欧美久久久久9999| 久久精品中文騷妇女内射| 久久一区二区免费播放| 99久久国产综合精品五月天喷水 | 91精品国产91久久| 一极黄色视频久久网站| 好属妞这里只有精品久久| 久久综合久久综合亚洲| 99精品久久精品一区二区|