使用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...