new — Operator (C++)
Przydziela pamięć dla obiektu lub tablicy obiektów z Nazwa typu z wolnego magazynu, a następnie zwraca wskaźnik odpowiednio wpisany, różniącego się od zera obiektu.
[!UWAGA]
Rozszerzenia składnik C++ firmy Microsoft zapewnia wsparcie dla słowa kluczowego new, aby dodać wpisy szczeliny vtable.Aby uzyskać więcej informacji, zobacz Nowy (nowe gniazdo w vtable).
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
Uwagi
W przypadku niepowodzenia nowy zwraca wartość zero lub zgłasza wyjątek; aby uzyskać więcej informacji, zobacz Operatory nowe i usunięcia.Można zmienić to domyślne zachowanie wpisując domyślną procedurę obsługi wyjątku i wywołując funkcje biblioteki środowiska uruchomieniowego _set_new_handler z nazwą Twojej funkcji jako argumentem.
Aby uzyskać informacje na temat tworzenia obiektu w zarządzanym stosie, zobacz gcnew.
Kiedy nowe jest użyte do alokacji pamięci dla obiektu klasy C++, konstruktor obiektu jest wywołany po alokowaniu pamięci.
Użyj operatora usuń, aby dealokować pamięć alokowaną nowym operatorem.
Poniższy przykład przydziela i następnie zwalnia dwuwymiarową tablicę znaków o rozmiarze dim przez 10.Przy alokowaniu wielowymiarowej tablicy, wszystkie wymiary, z wyjątkiem pierwszego, muszą być wyrażeniami stałymi, które obliczają do wartości dodatnich; wymiar tablicy skrajnie po lewej stronie może być każdym wyrażeniem, które oblicza do wartości dodatniej.Alokując tablicę przy użyciu operatora nowy, pierwszy wymiar może być zerem — operator nowy zwraca unikalny wskaźnik.
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
Nazwa typu nie może zawierać stałej, volatile, deklaracji klasy lub deklaracji enumeracji.Tym samym, poniższe wyrażenie jest niedozwolone:
volatile char *vch = new volatile char[20];
Operator nowy nie przydziela typów odwołań, ponieważ nie są obiektami.
Operator nowy nie może służyć do przydzielania funkcji, ale może służyć do przydzielania wskaźników do funkcji.Poniższy przykład przydziela i następnie zwalnia tablicę siedmiu wskaźników do funkcji, które zwracają liczby całkowite.
int (**p) () = new (int (*[7]) ());
delete *p;
Jeśli korzystasz z operatora nowy bez żadnych dodatkowych argumentów i kompilujesz z opcją /GX, /EHa lub /EHs, kompilator wygeneruje kod, aby wywołać operator usuń jeśli konstruktor zgłasza wyjątek.
Na poniższej liście opisano elementy gramatyki nowa:
położenie
Oferuje możliwość przekazywania dodatkowych argumentów, jeśli przeładujesz nowy.nazwa typu
Określa typ, jaki ma zostać przydzielony; może być to typ wbudowany lub zdefiniowany przez użytkownika.Jeśli specyfikacja typu jest skomplikowana, może być otoczona nawiasami, aby wymusić kolejność wiązania.Inicjator
Oferuje wartości dla zainicjowanego obiektu.Nie można określić inicjatorów dla tablic.Operator nowy spowoduje utworzenie tablic obiektów tylko wtedy, gdy klasa ma domyślnego konstruktora.
Przykład
Poniższy przykład kodu przydziela tablicy znaków i obiekt klasy CName i następnie zwalnia je.
// 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;
}
Jeśli korzystasz z formularza nowego położenia operatora Nowy, formularza z argumentami prócz rozmiaru alokacji, kompilator nie obsługuje formularza położenia operatora Usuń, jeśli konstruktor zgłasza wyjątek.Na przykład:
// 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;
}
Zobacz też
Informacje
Wyrażenia z operatorami jednoargumentowymi
Okres istnienia obiektów przydzielonych za pomocą instrukcji new
Inicjowanie obiektów przydzielonych za pomocą instrukcji new