new/delete与malloc/free的区别与联系详解
本博客主要說明new/delete,malloc/free的區別與聯系,如下:
1.malloc/free為C的標準庫函數,函數原型為:
void* malloc(size_t size)//參數代表字節個數 void free(void* pointer)//參數代表內存地址new、delete則為C++的操作運算符,它調用的分別為賦值運算符重載operator new()和operator delete();
2.在使用上,malloc/free如下:
void func(){//開辟一個空間int* p1=(int*)malloc(sizeof(int));if(p1==NULL){exit(1);}free(p1);//開辟多個空間int*p2=(int*)malloc(sizeof(int)*4);if(p2==NULL){exit(1);}free(p2);}用malloc分別開辟了1個和4個整型大小的空間和并free釋放它們;
new/delete如下:
void func(){//開辟一個空間int* p1=new int(1);delete p1;//開辟多個空間int*p2=new int[4];delete []p2;}由此可知:
? (1)malloc開辟空間類型大小需手動計算,new是由編譯器自己計算;
? (2)malloc返回類型為void*,必須強制類型轉換對應類型指針,new則直接返回對應類型指針;
? (3)malloc開辟內存時返回內存地址要檢查判空,因為若它可能開辟失敗會返回NULL;new則不用判斷,因為內存分配失敗時,它會拋出異常bac_alloc,可以使用異常機制;
? (4)無論釋放幾個空間大小,free只傳遞指針,多個對象時delete需加[](原因在第3);
3.malloc/free為函數只是開辟空間并釋放,new/delete則不僅會開辟空間,并調用構造函數和析構函數進行初始化和清理,如下為new/delete、new[]/delete[]實現機制:
而new[]/delete[]則為:
即過程如上,在開辟大小會多開辟四個字節,用于存放對象的個數,在返回地址時則會向后偏移4個字節,而在delete時則會查看內存上對象個數,從而根據個數count確定調用幾次析構函數,從而完全清理所有對象占用內存。
所以解釋2原因:對于內置類型若new[]但用delete釋放時,沒有影響,但若是自定義類型如類時,若釋放使用 delete
時,這時則會只調用一次析構函數,只析構了一個對象,剩下的對象都沒有被清理。
4.由上圖還可以看出new/delete底層是基于malloc/free來實現的,而malloc/free不能基于new/delete實現;
5.因為new/delete是操作符,它調用operator new / operator delete,它們可以被重載,在標準庫里它有8個重載版本;而malloc/free不可以重載;
6.對于malloc分配內存后,若在使用過程中內存分配不夠或太多,這時可以使用realloc函數對其進行擴充或縮小,但是new分配好的內存不能這樣被直觀簡單的改變;
7.對于new/delete若內存分配失敗,用戶可以指定處理函數或重新制定分配器(new_handler(可以在此處進行擴展)),malloc/free用戶是不可以處理的。
8.最后一點對于new/delete與malloc/free申請內存位置說明,malloc我們知道它是在堆上分配內存的,但new其實不能說是在堆上,C++中,對new申請內存位置有一個抽象概念,它為自由存儲區,它可以在堆上,也可以在靜態存儲區上分配,這主要取決于operator new實現細節,取決與它在哪里為對象分配空間。
所以有一些說法:new在堆上分配內存,可以說是不太精確的。(以上則為我總結的new/delete與malloc/free基本區別聯系)
總結
以上是生活随笔為你收集整理的new/delete与malloc/free的区别与联系详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多态定义、多态实现、多态分类。
- 下一篇: const与#define相比,区别和优