12 關於動態記憶體分配

2021-10-09 02:48:48 字數 1812 閱讀 3412

new關鍵字的功能類似於c語言中的malloc,它們都是從堆空間中申請一段記憶體。下面幾點是兩者之間的異同點:

new是c++中的關鍵字,而malloc是c庫提供的函式,有些c編譯器可能是沒有這個庫的,那麼就會導致不能申請動態空間

new是以具體型別為單位進行記憶體分配,而malloc是以位元組為單位進行記憶體分配。

new在申請單個型別變數時可以進行初始化,而malloc不可以,calloc函式雖然是將空間裡的值初始化為0,但是並不是初始化為使用者希望的值,所以還不是真正意義上的初始化。

new能夠觸發建構函式的呼叫,malloc僅分配需要的記憶體空間

在c++中在堆空間為物件申請空間時,是需要呼叫建構函式的,而這個必須通過new關鍵字來實現,因為採用malloc函式只是說從堆空間中申請一段記憶體,但是並不會呼叫建構函式,也就是說生成的物件是不合法的.

物件的建立只能使用用new,malloc函式不適合物件導向開發

delete在所有c++編譯器都被支援

free在沒有c庫的時候不能夠被呼叫,而某些開發系統中是沒有c庫的

delete能夠觸發析構函式的呼叫,free僅僅歸還之前分配的記憶體空間

物件的銷毀只能夠用delete,free不適合物件導向開發

new是通過delete釋放空間的,而malloc是以free來釋放空間的。對此要特別注意的是:

(1)對單個型別變數的釋放和對陣列的釋放在形式上是有區別的,對陣列空間進行釋放時一定要加上。

(2)用new就一定用delete,用malloc就用free,不能夠混合使用,原因如下:

因為這樣雖然可以通過編譯,但是這是會帶來問題的,假設用new為物件在對空間中申請了一段記憶體,那麼此時就會出發建構函式的呼叫,從而完成物件的構造,當使用delete關鍵字來歸還空間時,首先會呼叫析構函式,進行物件的銷毀,然後再歸還空間,但是當使用free函式來歸還空間,這時是不會自動呼叫析構函式的,它完成的工作僅僅是歸還堆空間,那麼如果此時物件裡面的成員變數也是從堆空間裡面申請的,那麼這時就會造成記憶體洩露。同樣地,我們不能夠用delete用mallocd申請的堆空間,有可能通過編譯,但是同樣的也會帶來問題,有可能這個問題會暫時沒出現,因為用malloc函式申請堆空間時並沒有生成乙個合法的物件,而用delete關鍵字就會呼叫析構函式,去呼叫乙個不合法物件的析構函式是很可能會出現問題的。

例程1:

例程2:

#include

#include

#include

//c標準通用實用庫,此標頭定義了幾個通用功能,包括動態記憶體管理,隨機數生成,與環境的通訊,整數算術,搜尋,排序和轉換。

分析:此處只呼叫了乙個建構函式和析構函式,因此證明了此文開頭的一些結論,這裡也可修改程式驗證其餘的結論,這裡就不一一演示了。

關於動態記憶體分配

動態記憶體分配方式在很多場合下有著重要的意義。動態分配使得記憶體的利用效率大大提高,在一些記憶體受限的情況下顯得極為重要。但是動態分配會帶來乙個問題,如何釋放。這個問題的關鍵就是,在釋放的時候,如何獲知這塊需要釋放的記憶體空間是多少位元組的。在文中,筆者談到new malloc 等方式動態分配的記憶...

動態記憶體分配

在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...

動態記憶體分配

為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...