運算子新函式
在程式中發生如下所示的陳述式時,它會轉譯為函式的呼叫operator new:
備註
char *pch = new char[BUFFER_SIZE];
如果要求是零個位元組的儲存空間,如運算子 new 傳回不同的物件的指標 (也就是重複呼叫 new 運算子傳回不同的指標)。 如果記憶體不足,無法配置要求, new 運算子傳回 NULL 或擲回例外狀況 (請參閱 新增及刪除運算子如需詳細資訊)。
您可以撰寫的常式會嘗試釋放記憶體,並再試一次配置 ; 請參閱 _set_new_handler 如需詳細資訊。 如需修復配置的詳細資訊,請參閱下列主題中, 處理沒有足夠的記憶體容量。
兩個範圍的operator new下表中所述的函式。
範圍運算子新函式
運算子 |
範圍 |
---|---|
:: 運算子 new |
Global |
類別名稱:: 運算子 new |
類別 |
第一個引數,以運算子 new 必須是型別 size_t (STDDEF 中所定義的型別。H) 和傳回型別永遠是 void *。
全域運算子 new 函式被呼叫時 新 運算子用來配置內建型別的物件、 類別型別的物件不包含使用者定義 運算子 new 函式和任何型別的陣列。 當新 運算子用來配置類別型別的物件其中 new 運算子定義時,該類別的 new 運算子呼叫。
運算子 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;
}
括號,以提供的引數新傳遞至Blanks::operator new與chInit引數。 不過,全域運算子 new 函式為隱藏狀態,導致程式碼,如下所示的產生錯誤:
Blanks *SomeBlanks = new Blanks;
在 Visual C++ 5.0 及之前版本,nonclass 型別和所有的陣列 (不論是否它們是一樣的類別 型別) 配置使用 新 運算子一律使用全域 運算子 new 函式。
以 Visual C++ 5.0 為開頭,編譯器支援成員陣列新 和 刪除類別宣告中的運算子。 例如:
// 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;
}