C++筆記: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就可以不位於堆中。(理解:我們的new從堆山操作,而堆再在自由存儲區上去malloc擴展自己,相當於更底層一定點了

2.7 分配失敗

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

2.8 內存泄漏

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章