共用方式為


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 開始,編譯器在類別宣告中支援成員陣列 newdelete 運算子。 例如:

// 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;
}

請參閱

參考

operator delete 函式

new 運算子 (C++)

delete 運算子 (C++)