簡體   English   中英

用於堆上內存分配的新運算符

[英]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 newnew運算符之間的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運算符的工作方式大致如下:

  1. 使用operator new分配內存以保存請求的對象。
  2. 調用對象構造函數(如果有)。 如果拋出異常,請使用operator delete釋放上述內存,然后傳播異常。
  3. 返回指向新構造對象的指針。

因為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 newoperator delete來代替C的mallocfree

您將new表達式與operator new()函數混淆。 編譯前者時,編譯器會生成對operator new()函數的調用,並傳遞足夠大小以保存new表達式中提到的類型,然后返回該類型的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM