• <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++博客 :: 首頁 :: 新隨筆 :: 聯(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語言的標(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ù)類型的對(duì)象而言,光用maloc/free無法滿足動(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。注意new/delete不是庫(kù)函數(shù)。

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



            類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來完成初始化與清除工作。函數(shù)UseNewDelete則簡(jiǎn)單得多。

            所以我們不要企圖用malloc/free來完成動(dòng)態(tài)對(duì)象的內(nèi)存管理,應(yīng)該用new/delete。由于內(nèi)部數(shù)據(jù)類型的“對(duì)象”沒有構(gòu)造與析構(gòu)的過程,對(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ì)象因無法執(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 閱讀(300) 評(píng)論(0)  編輯 收藏 引用 所屬分類: c++學(xué)習(xí)
            91久久香蕉国产熟女线看| 精品久久久久久国产三级| 久久综合久久综合亚洲| 精品熟女少妇AV免费久久| 一本一本久久aa综合精品| 国产91色综合久久免费| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久精品免费一区二区三区| 精品久久久久久久久中文字幕| 亚洲国产成人久久精品影视| 少妇久久久久久被弄到高潮| 久久综合亚洲欧美成人| 久久国产成人| 高清免费久久午夜精品| 亚洲午夜久久久| 国产91久久综合| MM131亚洲国产美女久久| 久久AAAA片一区二区| 久久国产色AV免费看| 久久午夜福利无码1000合集| 精品国产婷婷久久久| 久久国产一区二区| 久久国产色AV免费看| 伊人久久大香线焦AV综合影院| 久久久无码精品午夜| 国产一区二区精品久久凹凸 | 思思久久精品在热线热| 国产综合精品久久亚洲| 香蕉久久一区二区不卡无毒影院| 欧美精品久久久久久久自慰| 久久亚洲精品无码VA大香大香| 日本亚洲色大成网站WWW久久| segui久久国产精品| 99久久精品九九亚洲精品| 亚洲国产精品人久久| 青青国产成人久久91网| 久久综合狠狠综合久久激情 | 99国产欧美精品久久久蜜芽| 国产V综合V亚洲欧美久久| 久久亚洲国产欧洲精品一| 国内精品久久久久久久影视麻豆|