malloc
int *p = (int *) malloc(sizeof(int) * length);
free
free(p)
new
int *p2 = new int[length];
A *a = new A
delete
delete a[]
相同點:
1.都可以用于動态申請記憶體。
2.申請的記憶體都需要手動釋放。
不同點:
1.malloc/free 是C/C++的标準庫函數,new/delete 是c++運算符。
2.malloc/free要庫檔案支援,new/delete 不需要。
3.malloc申請記憶體時,需要知道申請記憶體的總位元組數。不知道申請的記憶體是什麼類型的
new 申請記憶體時,不需要一定寫明申請的記憶體大小。自動計算需要配置設定的空間。
4.new是類型安全的
int* p = new float[2]; // 編譯時指出錯誤
int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤
5.new 由operator new 和 construct組成,new會調用constructor,而malloc不能;delete 調用destructor,free不能。
6.new/delete的功能大部分完全覆寫了malloc/free,但是若是C程式,就隻能調用malloc/free管理記憶體。
7.new/delete中的operator new/operator delete 可以被重載的。
8.能夠重新配置設定記憶體
malloc配置設定後,如果使用時發現記憶體不足,可以使用realloc函數進行記憶體重新配置設定實作記憶體的擴充。realloc先判斷目前的指針所指記憶體是否有足夠的連續空間,如果有,原地擴大配置設定記憶體位址,并傳回原來的指針位址;如果空間不夠,按照新的位址配置設定空間,将原有資料拷貝到新位址,并釋放原來的記憶體區域。
9.傳回類型不一樣
malloc傳回的類型是void *,在調用時要顯式地進行類型轉換,轉換void *到所需要的指針類型。
new 是明确知道傳回是什麼類型的。
10.記憶體配置設定失敗時,new 抛出異常,malloc配置設定失敗時傳回NULL。
11.malloc 用free釋放,new 用delete 釋放。
用free釋放new建立的動态對象,因為無法執行西溝函數可能導緻出錯。如果用delete釋放”malloc申請的動态記憶體”,理論上程式不會出錯,但是程式可讀性變差。
參考表格
特征 | new/delete | malloc/free |
配置設定記憶體的位置 | 自由存儲區 | 堆 |
記憶體配置設定失敗傳回值 | 完整類型指針 | void* |
記憶體配置設定失敗傳回值 | 預設抛出異常 | 傳回NULL |
配置設定記憶體的大小 | 由編譯器根據類型計算得出 | 必須顯式指定位元組數 |
處理數組 | 有處理數組的new版本new[] | 需要使用者計算數組的大小後進行記憶體配置設定 |
已配置設定記憶體的擴充 | 無法直覺地處理 | 使用realloc簡單完成 |
是否互相調用 | 可以,看具體的operator new/delete實作 | 不可調用new |
配置設定記憶體時記憶體不足 | 客戶能夠指定處理函數或重新制定配置設定器 | 無法通過使用者代碼進行處理 |
函數重載 | 允許 | 不允許 |
構造函數與析構函數 | 調用 | 不調用 |
參考資料:
1.http://www.linuxidc.com/Linux/2016-01/127591.htm