Nowy podmiot (C++)
Przydzielanie pamięci dla obiektu lub Tablica obiektów Nazwa typu z wolnym magazynu, a następnie zwraca wskaźnik odpowiednio maszynowy, różną od zera do obiektu.
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
Uwagi
W razie niepowodzenia, Nowy zwraca wartość zero lub zgłasza wyjątek; zobacz nowych i usunąć Operatorzy Aby uzyskać więcej informacji.To zachowanie domyślne można zmienić, pisania niestandardowych procedury obsługi wyjątków i wywoływania _set_new_handler run-time library funkcji z nazwą funkcji jako argumentu.
Informacje na temat tworzenia obiektu na stercie zarządzanym, zobacz gcnew.
Gdy Nowy jest używany do przydzielania pamięci dla obiektu klasy C++, konstruktora obiektu jest nazywany po pamięć jest przydzielona.
Użyj usunąć operatora dezalokuj pamięć przydzielona z Nowy operatora.
W poniższym przykładzie przydziela i zwalnia następnie dwuwymiarowej tablicy znaków rozmiar dim przez 10.Przydzielanie Tablica wielowymiarowa wszystkich wymiarów z wyjątkiem pierwszego musi być stała wyrażeń, które oceniają wartości dodatnie; wymiar tablicy skrajnej lewej może być dowolnego wyrażenia, którego wynikiem jest wartość dodatnią.Podczas przydzielania tablicy przy użyciu Nowy operatora, pierwszym wymiarem może być równa zero — Nowy operator zwraca wskaźnik unikatowe.
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
Nazwa typu nie może zawierać const, volatile, deklaracje klas lub deklaracji wyliczenia.W związku z tym następujące wyrażenie jest nielegalne:
volatile char *vch = new volatile char[20];
Nowy operator nie przydzielał typy odwołań, ponieważ nie są obiektami.
Nowy operatora nie można przydzielić funkcji, ale może służyć do przydzielania wskaźników do funkcji.W poniższym przykładzie przydziela oraz zwalnia następnie tablicy siedmiu wskaźników do funkcji, które zwracają liczby całkowite.
int (**p) () = new (int (*[7]) ());
delete *p;
Użycie operatora Nowy bez żadnych dodatkowych argumentów i kompilacji z /GX, /EHa, lub /EHs opcji, kompilator wygeneruje kod, aby wywołać operatora usunąć Jeśli konstruktora zgłasza wyjątek.
Na poniższej liście opisano elementy gramatyki Nowy:
położenie
Umożliwia przekazywanie dodatkowych argumentów, jeśli użytkownik przeciążenie Nowy.Nazwa typu
Określa typ, które mają zostać przydzielone; może to być typ wbudowana lub zdefiniowana przez użytkownika.Jeśli specyfikacja typu jest skomplikowany, można otoczony nawiasy, aby wymusić kolejność wiązania.Inicjator
Zawiera wartość zainicjować obiektu.Nie można określić Inicjatory dla tablic.Nowy operatora 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 używasz położenie nowego formularza z nowych operatora, formularz z argumentami, oprócz rozmiar alokacji, kompilator nie obsługuje formie położenie usunąć operatora, jeżeli konstruktora 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 operatory jednoargumentowe
Okres istnienia przydzielone obiekty z nowych
Inicjowanie przydzielone obiekty z nowych