Freigeben über


new-Operator (C++)

Belegt für ein Objekt oder ein Objektarray des Typnamens des freien Speicher und gibt einen Speicher entsprechend typisierten ungleich 0 (null) Zeiger auf das Objekt zurück.

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

Hinweise

Wenn fehlschlägt, gibt neu (null) zurück oder löst eine Ausnahme aus. Weitere Informationen finden Sie unter Das neue und delet-Operatoren .Sie können dieses Standardverhalten ändern, indem Sie eine benutzerdefinierte Ausnahmebehandlung routine schreiben und die Funktion zum _set_new_handler Laufzeitbibliothek dem Funktionsnamen als Argument aufrufen.

Informationen dazu, wie ein Objekt im verwalteten Heap finden Sie unter gcnewerstellt.

Wenn neu verwendet wird, um für Klassenobjekt Ein C++-Compiler Speicher belegen, wird der Konstruktor des Objekts aufgerufen, nachdem der Arbeitsspeicher zugeordnet ist.

Verwenden Sie den Löschen-Operator, um den Arbeitsspeicher freizugeben, der dem neu-Operator zugeordnet ist.

Im folgenden Beispiel ordnet zugewiesen und dann ein zweidimensionales Array der Größe dim Zeichen durch 10.Wenn ein mehrdimensionales Array zuweisen, müssen alle Dimensionen mit Ausnahme der erste konstante Ausdrücke sein, die den positiven Werte ergeben. Die am weitesten links stehende Arraydimension kann ein beliebiger Ausdruck sein, der zu einem positiven Wert ergibt.Wenn sie ein Array unter Verwendung des Operators neu die erste Dimension kann null sein zuordnet — Operator gibt einen eindeutigen neu der Zeiger zurück.

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

Der Typname kann const, volatileenum oder Klassendeklarationen, Deklarationen enthalten.Daher ist der folgende Ausdruck nicht gültig:

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

Der Operator neu keinem Verweistypen, da sie keine Objekte sind.

Der neu-Operator kann nicht verwendet werden, um eine Funktion zugeordnet, sie kann jedoch verwendet werden, um Zeiger auf Funktionen zugeordnet werden soll.Im folgenden Beispiel wird auf und gibt ein Array aus sieben Zeiger auf Funktionen gemeinsam, die ganze Zahlen.

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

Wenn Sie den Operator neu ohne zusätzliche Argumente verwenden und mit /GX, /EHaoder /EHs - Option kompiliert wird, generiert der Compiler Code, um delete-Operator aufgerufen werden soll, wenn der Konstruktor eine Ausnahme auslöst.

Die folgende Liste beschreibt die Grammatik Elemente aus neu:

  • Platzierung
    Ermöglicht das Übergeben von zusätzlichen Argumenten bereit, wenn Sie neuüberladen.

  • Typname
    Gibt den Typ an zugeordnet werden soll. Es kann entweder integrierten oder benutzerdefinierten Typ sein.Wenn der Typ das heißt sie schwierig ist, kann sie in Klammern eingeschlossen werden, um die Reihenfolge der Bindung zu erzwingen.

  • Initialisierung
    Erstellt einen Wert für das initialisierte Objekt bereit.Initialisierer können nicht für Arrays angegeben werden.Der Operator neu-Objekten erstellt nur dann, wenn die Klasse über einen Standardkonstruktor verfügt.

Beispiel

Im folgenden Codebeispiel wird ein Zeichenarray und ein Objekt der Klasse CName zugewiesen und sie dann.

// 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;
}

Wenn Sie das neue Format der Position des Operators neu verwenden, unterstützt das Formular mit Argumenten zusätzlich zur Größe der Reservierung, der Compiler keine Positionierungsform des delet-Operators, wenn der Konstruktor eine Ausnahme auslöst.Beispiele:

// 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;
}

Siehe auch

Referenz

Ausdrücke mit unären Operatoren

C++-Schlüsselwörter

Lebensdauer von Objekten zugeordnet mit neuem

Die Objekte initialisieren zugeordnet mit neuem

Wie neue Werke

operator new-Funktion