共用方式為


運算子新函式

在程式中發生如下所示的陳述式時,它會轉譯為函式的呼叫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;
}

請參閱

參考

運算子 delete 函式

新運算子 (C++)

刪除運算子 (C++)