新運算子 (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;
}