C++ new和malloc的區別

這裏先對new和delete簡單進行一下總結,然後再細說new和malloc的區別。

一、new和delete

    C語言提供了malloc和free兩個系統函數,完成對堆內存的申請和釋放。而C++則提供了兩個關鍵字new和delete;

1.1 規則

  • new/delete是關鍵字,效率高於malloc和free。
  • 配對使用,避免內存泄漏和多重釋放。
  • 避免交叉使用,比如malloc申請空間delete釋放,new出的空間被free。
  • new/delete 主要是用在類對象的申請和釋放。申請的時候會調用構造器完成初始化,釋放的時候,會調用析構器完成內存清理。

1.2 new/new[] 用法

    //開闢單地址空間
    int *p = new int;  //開闢大小爲sizeof(int)空間
    int *q = new int(5); //開闢大小爲sizeof(int)的空間,並初始化爲5。
    //開闢數組空間
    //一維
    int *a = new int[100]{0};//開闢大小爲100的整型數組空間,並初始化爲0。
    //二維
    int (*a)[6] = new int[5][6];
    //三維
    int (*a)[5][6] = new int[3][5][6];
    //四維及以上以此類推。

1.3 delete/delete[] 用法

    //釋放單個int空間
    int *a = new int;
    delete a;
    //釋放int數組空間
    int *b = new int[5];
    delete []b;

二、new和malloc的區別

2.1 屬性

    new和delete是C++關鍵字,需要編譯器支持;malloc和free是庫函數,需要頭文件支持。

2.2 參數

    使用new操作符申請內存分配時無須指定內存塊的大小,編譯器會根據類型信息自行計算。而malloc則需要顯式地指出所需內存的尺寸。

2.3 返回類型

    new操作符內存分配成功時,返回的是對象類型的指針,類型嚴格與對象匹配,無須進行類型轉換,故new是符合類型安全性的操作符。而malloc內存分配成功則是返回void * ,需要通過強制類型轉換將void*指針轉換成我們需要的類型。

2.4 自定義類型

    new會先調用operator new函數,申請足夠的內存(通常底層使用malloc實現)。然後調用類型的構造函數,初始化成員變量,最後返回自定義類型指針。delete先調用析構函數,然後調用operator delete函數釋放內存(通常底層使用free實現)。

    malloc/free是庫函數,只能動態的申請和釋放內存,無法強制要求其做自定義類型對象構造和析構工作。

2.5 重載

    C++允許重載new/delete操作符,malloc不允許重載。

2.6 內存區域

    new做兩件事:分配內存和調用類的構造函數,delete是:調用類的析構函數和釋放內存。而malloc和free只是分配和釋放內存。

    new操作符從自由存儲區(free store)上爲對象動態分配內存空間,而malloc函數從堆上動態分配內存。自由存儲區是C++基於new操作符的一個抽象概念,凡是通過new操作符進行內存申請,該內存即爲自由存儲區。而堆是操作系統中的術語,是操作系統所維護的一塊特殊內存,用於程序的內存動態分配,C語言使用malloc從堆上分配內存,使用free釋放已分配的對應內存。自由存儲區不等於堆,如上所述,佈局new就可以不位於堆中。

2.7 分配失敗

    new內存分配失敗時,會拋出bac_alloc異常。malloc分配內存失敗時返回NULL。

2.8 內存泄漏

    內存泄漏對於new和malloc都能檢測出來,而new可以指明是哪個文件的哪一行,malloc確不可以。


Reference :

發佈了274 篇原創文章 · 獲贊 50 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章