new 和 malloc 的區別與運用

2021-10-09 22:32:05 字數 1455 閱讀 1123

c++中new運算子用於動態分配和撤銷記憶體的運算子。

開闢單變數位址空間

開闢乙個存放陣列的儲存空間,返回乙個指向該儲存空間的位址,int *a = new int 即為將乙個int型別的位址賦值給整型指標a;int *a = new int(5) 作用同上,但是同時將整數賦值為5

開闢陣列空間

要訪問new所開闢的結構體空間,無法直接通過變數名進行,只能通過賦值的指標進行訪問。用 new 可以動態開闢,撤銷位址空間。在程式設計序時,若用完乙個變數,下次需要再用,可以在每次開始使用時開闢乙個空間,在用完後撤銷它

使用者是無法主動呼叫建構函式的,所以需要借助placement new,但是使用者可以主動呼叫析構函式,所以用完這些物件後,呼叫析構函式,然後用對應分配記憶體的方法去釋放記憶體。事實上malloc並不一定比operator new節省多少時間,用placement new常常是為了考慮效能,所以會配合記憶體池一起使用。

void

*malloc

(unsigned

int num_bytes)

;//分配長度為num_bytes位元組的記憶體塊

返回值是void指標,void *表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者其他資料型別),可以通過型別強制轉化轉化為其他任意型別指標。如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標 null。

malloc()是動態記憶體分配函式,用來向系統請求分配記憶體空間。當無法知道記憶體具體的位置時,想要繫結真正的記憶體空間,就要用到malloc()函式。因為malloc只管分配記憶體空間,並不能對分配的空間進行初始化,所以申請到的記憶體中的值是隨機的,經常會使用memset()進行置0操作後再使用。

new 是操作符,而 malloc 是函式

new 引數是資料型別,malloc 是記憶體大小

new 在呼叫的時候先分配記憶體,再呼叫建構函式,釋放的時候呼叫析構函式

new 是型別安全的,返回物件型別指標,malloc 返回 void*,需要強轉

new可以被過載

malloc 可以被realloc擴容

new 發生錯誤丟擲異常,malloc 返回 null

malloc 可以分配任意位元組,new 只能分配例項所佔記憶體的整數倍數大小

malloc 匹配 free,new 匹配 delete

new 操作符從自由儲存區(free store)上為物件動態分配記憶體空間,而 malloc 函式從堆上動態分配記憶體。自由儲存區是 c++ 基於 new 操作符的乙個抽象概念,凡是通過 new 操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體動態分配,c 語言使用 malloc 從堆上分配記憶體,使用 free 釋放已分配的對應記憶體。自由儲存區不等於堆

new與malloc的區別

1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...

new與malloc的區別

malloc 與free 是c c 語言的標準庫函式,new delete 是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於 malloc...

Malloc與new 的區別

malloc與new 的區別 1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行...