new檔案用來管理c++的動态記憶體,這個檔案聲明了幾個全局空間的函數(不是std空間的函數,全局空間的函數調用時是用全局作用域解析符),包括operator
new 和operator delete的重載 ,這些函數用于處理動态存儲空間請求。
其new的頭檔案源代碼
1、關于new operator與operator new
operator new() 僅僅配置設定記憶體空間,是對malloc的一個封裝,傳回的是一個void
*,如
隻是對a配置設定了空間,通過vs2012進行調試你會發現operator new
的實作如下:其主要是調用malloc(size),而沒有對記憶體進行初始化
對于new operator先調用operator new配置設定記憶體空間,然後調用構造函數初始化
由于operator new 隻是配置設定空間未調用構造函數,是以公有變量未初始化,是個随機值,
而new Foo() 先調用operator new 然後再構造函數,是以會先出現Foo operator new
2、關于placement new(定位放置new)
placement new 是operator
new的一個重載的版本,如果你想在已經配置設定的記憶體中建立一個對象,這時不能使用new。而placement
new永許你在一個已經配置設定好的記憶體中(棧或者堆中)構造一個新的對象,原型中void*
p實際就是指向一個已經配置設定好的記憶體緩沖區的首位址。c++支援placement operator
new,能夠在預先配置設定的緩沖區中構造對象,避免new記憶體配置設定時查找記憶體和配置設定記憶體的時間,而且由于記憶體已經配置設定,沒有記憶體配置設定失敗的危險,在記憶體池,垃圾回收器,和性能或異常安全可以使用
3、關于set_new_handler
new_handler類型的函數是預設記憶體申請函數(operator new和operator new[])申請記憶體失敗,會被調用。
new_handler函數會試圖為新的記憶體申請請求提供更多的可用空間。當且僅當,函數成功地提供了更多的可用空間,它才傳回。
否則,要麼抛出bad_alloc異常(或bad_alloc派生類)要麼終止程式(比如調用abort或exit)。
如果new_handler函數傳回(即,它提供了更多可用空間)後,當記憶體申請函數申請指定的記憶體空間失敗時,它會被再次調用,或直到new_handle函數不傳回或被替換。