Udostępnij za pośrednictwem


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

Słowa kluczowe języka C++

Okres istnienia obiektów przydzielonych za pomocą instrukcji new

Inicjowanie obiektów przydzielonych za pomocą instrukcji new

Jak działa słowo kluczowe new

Funkcja operatora new