[英]new operator for memory allocation on heap
我正在看新操作員的簽名。 這是:
void* operator new (std::size_t size) throw (std::bad_alloc);
但是當我們使用這個運算符時,我們從不使用強制轉換。 即
int *arr = new int;
那么,在這種情況下,C ++如何將void*
類型的指針轉換為int*
。 因為,即使malloc
返回void*
,我們也需要顯式地使用強制轉換。
operator new
和new
運算符之間的C ++存在非常細微的差別。 (再看一遍......排序很重要!)
函數operator new
是C的malloc
函數的C ++模擬。 它是一個原始內存分配器,其職責僅僅是生成一塊內存塊來構造對象。 它不會調用任何構造函數,因為這不是它的工作。 通常,您不會看到在C ++代碼中直接使用的operator new
; 它看起來有點奇怪。 例如:
void* memory = operator new(137); // Allocate at least 137 bytes
new
運算符是一個關鍵字,負責為對象分配內存並調用其構造函數。 這是C ++代碼中最常見的。 當你寫作
int* myInt = new int;
您正在使用new運算符來分配新的整數。 在內部, new
運算符的工作方式大致如下:
operator new
分配內存以保存請求的對象。 operator delete
釋放上述內存,然后傳播異常。 因為new
運算符和new
運算operator new
是分開的,所以可以使用new
關鍵字來構造對象而無需實際分配任何內存。 例如,着名的placement new允許您在用戶提供的內存中的任意內存地址上構建對象。 例如:
T* memory = (T*) malloc(sizeof(T)); // Allocate a raw buffer
new (memory) T(); // Construct a new T in the buffer pointed at by 'memory.'
通過定義自定義operator new
函數來重載new
運算符,可以以這種方式使用new
; 指定分配的方式,C ++編譯器將它連接到new
運算符。
如果你很好奇, delete
關鍵字的工作方式相同。 有一個稱為operator delete
的釋放函數負責處理內存,還有一個delete
操作符負責調用對象析構函數和釋放內存。 但是,例如,可以在這些上下文之外使用operator new
和operator delete
來代替C的malloc
和free
。
您將new
表達式與operator new()
函數混淆。 編譯前者時,編譯器會生成對operator new()
函數的調用,並傳遞足夠大小以保存new
表達式中提到的類型,然后返回該類型的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.