operator new 函式
在程式中遇到下面這類陳述式時,陳述式就會轉譯成 operator new 函式的呼叫:
備註
char *pch = new char[BUFFER_SIZE];
如果是要求零位元組的儲存區,則 operator new 會傳回不同物件的指標 (也就是說,重複呼叫 operator new 會傳回不同的指標)。 如果記憶體不足無法用於配置要求,則 operator new 會傳回 NULL 或擲回例外狀況 (如需詳細資訊,請參閱 new 和 delete 運算子)。
您可以撰寫常式,嘗試釋放記憶體並重試配置。如需詳細資訊,請參閱 _set_new_handler。 如需復原配置的詳細資訊,請參閱下列主題處理記憶體不足的情況。
下表描述 operator new 函式的兩個範圍。
operator new 函式的範圍
運算子 |
範圍 |
---|---|
::operator new |
Global |
class-name::operator new |
類別 |
operator new 的第一個引數必須屬於 size_t 類型 (在 STDDEF.H 中定義的類型),而且傳回類型一律為 void *。
全域 operator new 函式是在 new 運算子用於配置內建類型的物件、不包含使用者定義的 operator new 函式之類別類型的物件,以及任何類型的陣列時呼叫。 當 new 運算子用於配置其中已定義 operator new 的類別類型物件時,就會呼叫該類別的 operator new。
為類別定義的 operator new 函式為靜態成員函式 (因此不可為虛擬),它會隱藏該類型類別之物件的全域 operator new 函式。 假設有 new 用來將記憶體配置和設定為特定值的案例:
// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>
class Blanks
{
public:
Blanks(){}
void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
void *pvTemp = malloc( stAllocateBlock );
if( pvTemp != 0 )
memset( pvTemp, chInit, stAllocateBlock );
return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
Blanks *a5 = new(0xa5) Blanks;
return a5 != 0;
}
以括號提供給 new 的引數會傳遞至 Blanks::operator new 做為 chInit 引數。 不過,全域 operator new 函式已隱藏,因此造成下列程式碼產生錯誤:
Blanks *SomeBlanks = new Blanks;
在 Visual C++ 5.0 (函) 以前版本中,使用 new 運算子配置的非類別類型和所有陣列 (無論是否屬於 class 類型) 一律使用全域 operator new 函式。
從 Visual C++ 5.0 開始,編譯器在類別宣告中支援成員陣列 new 和 delete 運算子。 例如:
// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
void * operator new[] (size_t)
{
return 0;
}
void operator delete[] (void*)
{
}
};
int main()
{
MyClass *pMyClass = new MyClass[5];
delete [] pMyClass;
}