C 記憶體管理 new操作符和delete操作符

2021-08-22 08:53:50 字數 1805 閱讀 4695

使用new [型別]可以申請乙個[型別]的空間,返回值為[型別]的指標,例如new int(申請單個型別的空間) ,new int[10](申請陣列的空間)。

new申請的空間也是在堆裡。

使用new [單個型別](初始化值)可以進行初始化,連續的空間不可以使用此方式進行初始化

delete [單個型別]來釋放單個型別的空間,用delete來釋放申請的連續的空間。

new申請的空間的時候會呼叫類的建構函式,delete在銷毀空間的時候會呼叫類的析構函式,而malloc家族只是在堆上劃分空間,free只是將空間歸還給作業系統,並不會呼叫任何的函式。

new操作符申請類型別空間的流程

首先是在堆上申請相應大小的空間(迴圈使用malloc,直到申請成功,申請失敗則會判斷是否要丟擲異常)

然後再編譯的時候,編譯器會加測new後面的型別是否是類型別(即是否需要構造),如果需要構造,編譯器會呼叫其建構函式。

delete操作符釋放類型別空間的流程

編譯器首先會判斷new 後面的指標型別是否指向乙個物件(即是否可以呼叫析構函式),如果可以,則會呼叫析構函式。

析構函式呼叫完成之後再將此塊空間歸還給作業系統(呼叫free進行釋放 )。

new操作符的申請類型別空間流程

如果要申請的類型別含有顯式的析構函式,那麼new會申請實際陣列的大小加上4個位元組,這4個位元組用於儲存陣列元素的個數,並且位於資料空間的前面。

申請空間完成之後,會呼叫每個元素的建構函式,即有多少元素就呼叫多少次。

delete操作符釋放空間的流程

首先判斷析構函式是否顯式的給出,如果是,那麼就先找到最先分配的四個位元組,得到物件的個數,然後進行逐個銷毀。

銷毀完成之後呼叫delete銷毀此塊空間加上前面的4個位元組。

記憶體池

有時我們不停地需要乙個乙個物件,但是每次使用new的話是非常浪費空間的,因為每次使用new的時候都會呼叫malloc,而malloc在申請記憶體的時候會浪費很多空間用來維護記憶體空間的資料,所以我們可以使用malloc一次性開闢一大塊空間,然後每次用的時候在裡面一塊一塊的拿即可,此時就要用到定位new表示式:

test *pt = (test *)malloc(sizeof(test) * 100);

new(pt) test;//每次需要物件的時候直接通過 定位new表示式 在已申請的空間中進行構造即可

malloc/free是函式,需要標頭檔案支援,new/delete是操作符,不需要標頭檔案支援

malloc申請記憶體需要位元組數,new申請記憶體需要型別

malloc返回值為void*,new返回值為指定型別的指標

malloc申請空間失敗返回null,new申請失敗丟擲異常

malloc不會呼叫建構函式,不能初始化變數,new可以呼叫建構函式,可以初始化申請的空間(陣列除外),free不會呼叫析構函式,delete會呼叫析構函式。

new用記憶體池不一定在堆空間中申請記憶體,在哪兒開闢的記憶體,使用定位new表示式的時候,就會從哪兒申請記憶體。

操作符 new 動態變數 基本記憶體管理

1.用操作符new建立指定型別的乙個新的動態變數,返回指向這個新變數的指標。int p p new int c 標準規定,若沒有足夠的記憶體來建立新變數,操作符new缺省會終止程式。系統會為動態變數保留乙個特殊的記憶體區域,它稱為自由儲存。程式新建的任何動態變數都會消耗自由儲存中的部分記憶體。如果你...

new 操作符和 new 操作的區別

操作符 new operator 和 new操作 operator new 的區別。當你寫這樣的 string ps new string memory management 你使用的 new 是 new 操作符。這個操作符就象 sizeof 一樣是語言內建的,你不能改變它的含義,它的功能總是一樣的...

布局new操作符

通常,new負責在堆 heap 中找到乙個足以滿足需要的記憶體塊。new操作符還有另一種變體,被稱為布局new操作符,能夠讓你指定要使用的位置。程式設計師可以利用這種 要使用布局new特性,首先要包含標頭檔案new,他提供了這種new操作的原型。const int buf 512 class jus...