new和malloc的區別

2021-08-28 05:21:28 字數 1542 閱讀 1713

malloc函式是c語言中stdlib.h標頭檔案下面用於還說呢情動態記憶體的函式,其返回的型別是同變數型別的指標。基本用法以及以申請int型和node型結構體變數為例的例子如下:

typename *p =

(typename*

)malloc

(sizeof

(typename));

int* p =

(int*)

malloc

(sizeof

(int))

;node* p =

(int*)

malloc

(sizeof

(node)

);

這個寫法的邏輯是,需要申請的記憶體空間的大小(即sizeof(node))為malloc函式的引數,這樣malloc就會想記憶體申請一塊大小為sizeof(node)的空間,並且返回指向這塊空間的指標。但是這個指標是乙個未確定型別的指標void*,因此需要把它強制轉換為node型別的指標因此在malloc之前加上(node)。

如果申請記憶體失敗,它就會返回空指標null。那麼什麼時候回申請失敗呢?一般來說,只是申請乙個鍊錶節點是不會失敗的。失敗一般發生在使用malloc申請了比較大的動態陣列的時候。即:

int

* p =

(int*)

malloc

(10000000

*sizeof

(int))

;

首先需要注意的就是,malloc是乙個函式,是要傳入引數的。而new的話只是c++裡面的乙個運算子。其返回型別同樣是申請的同變數型別的指標。基本用法如下。同樣以申請int型變數和node型結構體變數為例子。

typename* p = new typename;

int* p = new int

:node * p = new node;

可以看到,new的寫法比malloc要簡潔許多,只需要「new+型別名」即可分配一塊該型別的記憶體空間,並且返回乙個對應型別的指標。如果申請失敗,則會啟動c++的異常機制處理而不是返回空指標null。和malloc同理,如果是使用new申請了較大的動態陣列,即:

int

* p = new int

[10000000

]

這時候會發生異常,並在沒有特殊處理的情況下直接退出程式。不過只要是正常分配乙個節點的空間也是不會失敗的。

記憶體洩漏是指使用malloc與new開闢出來的記憶體空間在使用過後沒有釋放,導致其在程式結束之前始終佔據該記憶體空間,這在一些比較大的程式裡面很容易導致記憶體消耗過快以至於最後無記憶體可分配。c++的設計者認為,程式設計師完全有能力自己控制記憶體的分配和釋放,因此把對記憶體的控制操作全部交給了程式設計師。因此必須注意,在使用完malloc和new開闢出來的空間後必須將其釋放,否則會造成記憶體洩漏。其中記憶體釋放的方式,malloc使用free函式,而new則使用delete運算子。

new和malloc的區別

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

malloc和new的區別

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

new 和 malloc 的區別

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