共用方式為


新運算子 (C++)

物件或物件的陣列會配置記憶體型別名稱從可用的儲存,並傳回物件的適當型別,以非零值的指標。

[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]

備註

如果不成功, 傳回零或擲回例外狀況。 請參閱新增及刪除運算子如需詳細資訊。 您可以變更此預設行為,藉由撰寫自訂的例外處理常式,並呼叫 _set_new_handler 您做為引數的函式名稱的執行階段程式庫函式。

如何在 managed 堆積上建立物件的資訊,請參閱 gcnew

是用來配置記憶體給 C++ 類別物件,物件的建構函式後,會呼叫記憶體的配置。

使用刪除 運算子來解除配置的記憶體配置與 運算子。

下列範例會配置,並再釋出的字元大小的二維陣列dim以 10。 當配置多維陣列,除首頁之外的所有維度必須都是常數運算式評估為正數值。 最左邊的陣列維度可以是任何評估為正數值的運算式。 配置的陣列使用時 運算子,第一個維度可以是零, 運算子會傳回唯一的指標。

char (*pchar)[10] = new char[dim][10];
delete [] pchar;

型別名稱不能包含 const, volatile,類別宣告或列舉型別宣告。 因此,下列的運算式不合法的:

volatile char *vch = new volatile char[20];

運算子不會配置參考型別,因為它們不是物件。

運算子不能用來配置函式,但它可以用來配置函式的指標。 下列範例會配置,並再釋放七個函式指標會傳回整數陣列。

int (**p) () = new (int (*[7]) ());
delete *p;

如果您使用運算子 而不需要任何額外的引數和編譯與 /GX/EHa,或 /EHs 選項,編譯器會產生程式碼呼叫運算子刪除如果建構函式擲回例外狀況。

下列清單說明文法的元素

  • 位置
    提供方法,以傳遞其他引數,如果您多載的

  • 型別名稱
    指定要配置 ; 型別 它可以是內建或使用者定義型別。 若是複雜型別規格,它可以包圍括號,以讓資料繫結的排序。

  • 初始設定式
    提供的值初始化的物件。 無法指定陣列的初始設定式。 運算子的類別具有預設建構函式時,才會建立物件的陣列。

範例

下列程式碼範例會配置字元陣列和物件類別的CName ,然後加以釋出。

// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>

class CName {
public:
   enum {
      sizeOfBuffer = 256
   };

   char m_szFirst[sizeOfBuffer];
   char m_szLast[sizeOfBuffer];

public:
   void SetName(char* pszFirst, char* pszLast) {
     strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
     strcpy_s(m_szLast, sizeOfBuffer, pszLast);
   }

};

int main() {
   // Allocate memory for the array
   char* pCharArray = new char[CName::sizeOfBuffer];
   strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");

   // Deallocate memory for the array
   delete [] pCharArray;           
   pCharArray = NULL;

   // Allocate memory for the object
   CName* pName = new CName;
   pName->SetName("Firstname", "Lastname");

   // Deallocate memory for the object
   delete pName;
   pName = NULL;
}

如果您使用的位置的新形式的 運算子,除了大小的引數種程式配置時,編譯器不支援位置形式 刪除運算子如果建構函式擲回例外狀況。 例如:

// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
   A(int) { throw "Fail!"; }
};
void F(void) {
   try {
      // heap memory pointed to by pa1 will be deallocated
      // by calling ::operator delete(void*).
      A* pa1 = new A(10);
   } catch (...) {
   }
   try {
      // This will call ::operator new(size_t, char*, int).
      // When A::A(int) does a throw, we should call
      // ::operator delete(void*, char*, int) to deallocate
      // the memory pointed to by pa2.  Since
      // ::operator delete(void*, char*, int) has not been implemented,
      // memory will be leaked when the deallocation cannot occur.

      A* pa2 = new(__FILE__, __LINE__) A(20);
   } catch (...) {
   }
}

int main() {
   A a;
}

請參閱

參考

一元 (unary) 運算子的運算式

C + + 關鍵字

以新的配置物件的存留期

正在初始化 [以新的 [物件配置

新的運作方式

運算子新函式