日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

new/delete与malloc/free的区别与联系详解

發布時間:2025/6/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的区别与联系详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。