成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何進行malloc/free與new/delete的對比分析

今天給大家介紹一下如何進行malloc/free與new/delete的對比分析。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、墊江網(wǎng)站定制設(shè)計、自適應品牌網(wǎng)站建設(shè)、html5商城網(wǎng)站定制開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為墊江等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

相同點:都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存

不同點:

(1)操作對象有所不同。

malloc與free是C++/C 語言的標準庫函數(shù),new/delete 是C++的運算符。對于非內(nèi)部數(shù)據(jù)類的對象而言,光用maloc/free 無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù), 對象消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free 是庫函數(shù)而不是運算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強加malloc/free。

(2)用法上也有所不同。

函數(shù)malloc 的原型如下:

void * malloc(size_t size);

用malloc 申請一塊長度為length 的整數(shù)類型的內(nèi)存,程序如下:

int *p = (int *) malloc(sizeof(int) * length);

我們應當把注意力集中在兩個要素上:“類型轉(zhuǎn)換”和“sizeof”。

1、malloc 返回值的類型是void *,所以在調(diào)用malloc 時要顯式地進行類型轉(zhuǎn)換,將void * 轉(zhuǎn)換成所需要的指針類型。

2、 malloc 函數(shù)本身并不識別要申請的內(nèi)存是什么類型,它只關(guān)心內(nèi)存的總字節(jié)數(shù)。

函數(shù)free 的原型如下:

void free( void * memblock );

為什么free 函數(shù)不象malloc 函數(shù)那樣復雜呢?這是因為指針p 的類型以及它所指的內(nèi)存的容量事先都是知道的,語句free(p)能正確地釋放內(nèi)存。如果p 是NULL 指針,那么free對p 無論操作多少次都不會出問題。如果p 不是NULL 指針,那么free 對p連續(xù)操作兩次就會導致程序運行錯誤。

new/delete 的使用要點:

運算符new 使用起來要比函數(shù)malloc 簡單得多,例如:

int *p1 = (int *)malloc(sizeof(int) * length);  int *p2 = new int[length];

這是因為new 內(nèi)置了sizeof、類型轉(zhuǎn)換和類型安全檢查功能。對于非內(nèi)部數(shù)據(jù)類型的對象而言,new 在創(chuàng)建動態(tài)對象的同時完成了初始化工作。如果對象有多個構(gòu)造函數(shù),那么new 的語句也可以有多種形式。

如果用new 創(chuàng)建對象數(shù)組,那么只能使用對象的無參數(shù)構(gòu)造函數(shù)。

Obj *objects = new Obj[100];       // 創(chuàng)建100 個動態(tài)對象  不能寫成  Obj *objects = new Obj[100](1);        // 創(chuàng)建100 個動態(tài)對象的同時賦初值1

在用delete 釋放對象數(shù)組時,留意不要丟了符號‘[]’。

例如:

delete []objects; // 正確的用法  delete objects; // 錯誤的用法

后者相當于delete objects[0],漏掉了另外99 個對象。(objects是數(shù)組首地址)

再談二者區(qū)別:

1、new自動計算需要分配的空間,而malloc需要手工計算字節(jié)數(shù)

2、new是類型安全的,而malloc不是,比如:

int* p = new float[2]; // 編譯時指出錯誤  int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤

new operator 由兩步構(gòu)成,分別是 operator new 和 construct

3、operator new對應于malloc,但operator new可以重載,可以自定義內(nèi)存分配策略,甚至不做內(nèi)存分配,甚至分配到非內(nèi)存設(shè)備上。而malloc無能為力。

4、new將調(diào)用constructor,而malloc不能;delete將調(diào)用destructor,而free不能。

5、malloc/free要庫文件支持,new/delete則不要。

看下面這段代碼:

class Obj   {   public:       Obj( )        { cout  <<  "Initialization"  <<  endl; }       ~ Obj( )       { cout  <<  "Destroy" <<  endl; }       void Initialize( )       { cout  <<  "Initialization"  <<  endl; }       void  Destroy( )       { cout  <<  "Destroy"  <<  endl; }   }obj;      void  UseMallocFree( )   {       Obj   * a  =  (Obj  *) malloc( sizeof ( obj ) );      //  allocate memory        a -> Initialize();                                    //  initialization       // &hellip;        a -> Destroy();                                        // deconstruction        free(a);                                               // release memory   }      void  UseNewDelete( void )   {       Obj   * a  =   new  Obj;                                                  // &hellip;        delete a;

類Obj的函數(shù)Initialize實現(xiàn)了構(gòu)造函數(shù)的功能,函數(shù)Destroy實現(xiàn)了析構(gòu)函數(shù)的功能。函數(shù)UseMallocFree中,由于malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來完成“構(gòu)造”與“析構(gòu)”。所以我們不要用malloc/free來完成動態(tài)對象的內(nèi)存管理,應該用new/delete。由于內(nèi)部數(shù)據(jù)類型的“對象”沒有構(gòu)造與析構(gòu)的過程,對它們而言malloc/free和new/delete是等價的。

二者聯(lián)系:

既然new/delete的功能完全覆蓋了malloc/free,為什么C++還保留malloc/free呢?因為C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存。如果用free釋放“new創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構(gòu)函數(shù)而可能導致程序出錯。如果用delete釋放“malloc申請的動態(tài)內(nèi)存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete、malloc/free必須配對使用。

以上就是如何進行malloc/free與new/delete的對比分析的全部內(nèi)容了,更多與如何進行malloc/free與new/delete的對比分析相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進行學習哈!相信小編會給大家增添更多知識,希望大家能夠支持一下創(chuàng)新互聯(lián)!

本文題目:如何進行malloc/free與new/delete的對比分析
文章轉(zhuǎn)載:http://jinyejixie.com/article26/ghhccg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT定制開發(fā)、網(wǎng)站內(nèi)鏈網(wǎng)站設(shè)計公司、外貿(mào)網(wǎng)站建設(shè)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
康保县| 麻城市| 赤城县| 桂林市| 弋阳县| 右玉县| 健康| 姜堰市| 新民市| 瑞安市| 通山县| 扎囊县| 张家口市| 葫芦岛市| 周至县| 军事| 昌邑市| 阿瓦提县| 安庆市| 吉首市| 维西| 东方市| 石渠县| 运城市| 通许县| 荃湾区| 磐石市| 萨迦县| 忻州市| 晋州市| 建平县| 万安县| 寻乌县| 宜兴市| 高碑店市| 兴海县| 阿拉善盟| 琼中| 略阳县| 鹤庆县| 舒兰市|