c new 和 malloc的區別

2021-10-07 12:36:24 字數 1722 閱讀 9353

malloc是標準庫函式,支援覆蓋。new是運算子,支援過載

malloc和free僅僅分配和**空間,而new和delete除了分配**空間,還會呼叫建構函式和析構函式

malloc返回的是void型別指標,必須進行型別轉換。new返回的是具體型別指標

(1)malloc和new都是在堆上開闢記憶體的

malloc只負責開闢記憶體,沒有初始化功能,需要使用者自己初始化;new不但開闢記憶體,還可以進行初始化,如new int(10);表示在堆上開闢了乙個4位元組的int整形記憶體,初始值是10,再如new int[10] ();表示在堆上開闢了乙個包含10個整形元素的陣列,初始值都為0。

(2)malloc是函式,開闢記憶體需要傳入位元組數,如malloc(100);表示在堆上開闢了100個位元組的記憶體,返回void*,表示分配的堆記憶體的起始位址,因此malloc的返回值需要強轉成指定型別的位址;new是運算子,開闢記憶體需要指定型別,返回指定型別的位址,因此不需要進行強轉。

如堆上開闢int整形:

int

*p1 =

(int*)

malloc

(sizeof

(int))

;=> 根據傳入位元組數開闢記憶體,沒有初始化

int*p2 =

newint(0

);=> 根據指定型別int開闢乙個整形記憶體,初始化為0

int*p3 =

(int*)

malloc

(sizeof

(int)*

100);=

> 開闢400個位元組的記憶體,相當於包含100個整形元素的陣列,沒有初始化

int*p4 =

newint

[100](

);=> 開闢400個位元組的記憶體,100個元素的整形陣列,元素都初始化為0

(3)malloc開闢記憶體失敗返回null,new開闢記憶體失敗丟擲bad_alloc型別的異常,需要捕獲異常才能判斷記憶體開闢成功或失敗,new運算子其實是operator new函式的呼叫,它底層呼叫的也是malloc來開闢記憶體的,new它比malloc多的就是初始化功能,對於類型別來說,所謂初始化,就是呼叫相應的建構函式。

(4)malloc開闢的記憶體永遠是通過free來釋放的;而new單個元素記憶體,用的是delete,如果new陣列,用的是delete來釋放記憶體的。

alloca是向棧申請記憶體,因此無需釋放. malloc分配的記憶體是位於堆中的,並且沒有初始化記憶體的內容,因此基本上malloc之後,呼叫函式memset來初始化這部分的記憶體空間. calloc則將初始化這部分的記憶體,設定為0. 而realloc則對malloc申請的記憶體進行大小的調整.申請的記憶體最終需要通過函式free來釋放. 而sbrk則是增加資料段的大小;

對堆進行加鎖

在正式申請空間之前,對堆進行校驗

檢測申請記憶體塊的型別

檢測記憶體空間是否充足,不夠設定錯誤資訊,返回null,否則進行5

檢測塊的型別

計算本次所要申請的記憶體塊的總位元組數

按照計算的總位元組數申請記憶體,底層真正向堆申請空間的是heapalloc函式

檢測是否申請成功,如果申請失敗設定錯誤資訊,返回null,否則執行9

修改請求次數和目前申請的總位元組數

將新申請的記憶體塊的新節點頭插到雙向鍊錶中

給該結點對應的結構體賦值

填充空間

獲取申請記憶體塊中存放有效資料的真正位置

對堆進行解鎖

返回有效資料區域的位址

C new和malloc的區別

1 屬性 new delete是c 關鍵字,需要編譯器支援 malloc free是庫函式,需要標頭檔案支援。2 引數 使用new操作符申請記憶體分配時,無須指定記憶體塊的大小,編譯器會根據型別資訊自行計算 而使用malloc函式申請記憶體分配時,則需要顯式地指出所需記憶體的尺寸。3 返回型別 使用...

c new與malloc的區別

區別 1.malloc是c 語言的標準庫函式 而new是c 語言中的操作符。2.new返回指定型別的指標,並且可以自動計算所需空間的大小 而malloc必須要由使用者自己計算所需空間大小,並在返回後強行轉換為實際型別的指標。3.malloc只管記憶體分配,不能對所得的記憶體進行初始化,其所獲記憶體空...

new和malloc的區別

1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...