• <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í)
            777久久精品一区二区三区无码| 一本久久免费视频| 色综合久久夜色精品国产| 老司机国内精品久久久久| 99久久精品影院老鸭窝| 国产精品久久久久久久久鸭| 久久精品无码一区二区无码| 99久久这里只有精品| 国产91色综合久久免费| yellow中文字幕久久网| 精品久久久久中文字幕一区| 亚洲国产日韩欧美综合久久| 奇米影视7777久久精品人人爽| 欧美激情一区二区久久久| 久久久久亚洲精品天堂| 一级做a爰片久久毛片人呢| 国产精品九九久久免费视频 | 77777亚洲午夜久久多人| 亚洲国产精品无码久久久蜜芽| 人妻精品久久无码专区精东影业 | 大香伊人久久精品一区二区| 亚洲欧美日韩中文久久| 久久国产精品一区二区| 久久人人爽人人澡人人高潮AV | 国产亚洲精久久久久久无码| 99久久精品无码一区二区毛片| 精品久久久久久久久久中文字幕 | 欧美激情一区二区久久久| 久久精品中文字幕无码绿巨人| 国产99久久九九精品无码| 狠狠色丁香久久婷婷综合| 久久99精品国产99久久| 亚洲人成无码网站久久99热国产| 日韩av无码久久精品免费| 久久久久99精品成人片| 亚洲AV成人无码久久精品老人| 日韩一区二区久久久久久| 亚洲精品无码久久久影院相关影片 | 精品无码人妻久久久久久| 无码AV波多野结衣久久| 欧美精品一区二区久久|