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