operator new和placement new的區別
阿新 • • 發佈:2018-12-09
new 關鍵字 (1)呼叫operator new分配足夠的空間,並呼叫相關物件的建構函式 (2)不可以被過載
operator new (1)只分配所要求的空間,不呼叫相關物件的建構函式。當無法滿足所要求分配的空間時,則 ->如果有new_handler,則呼叫new_handler,否則 ->如果沒要求不丟擲異常(以nothrow引數表達),則執行bad_alloc異常,否則 ->返回0 (2)可以被過載 (3)過載時,返回型別必須宣告為void* (4)過載時,第一個引數型別必須為表達要求分配空間的大小(位元組),型別為size_t (5)過載時,可以帶其它引數
placement new: 只是operator new過載的一個版本。它並不分配記憶體,只是返回指向已經分配好的某段記憶體的一個指標。因此不能刪除它,但需要呼叫物件的解構函式。
如果你想在已經分配的記憶體中建立一個物件,使用new時行不通的。也就是說placement new允許你在一個已經分配好的記憶體中(棧或者堆中)構造一個新的物件。原型中void* p實際上就是指向一個已經分配好的記憶體緩衝區的的首地址。