Freigeben über


new-Operator (C++)

Weist einem Objekt oder einem Array von Objekten des Typs type-name Speicher aus dem freien Speicher zu und gibt einen typisierten Zeiger ungleich 0 an das Objekt zurück.

Hinweis

Erweiterungen der Microsoft C++-Komponente bieten Unterstützung für das new-Schlüsselwort, um dem vtable-Slot Einträge hinzuzufügen.Weitere Informationen finden Sie unter new (neuer Slot in vtable) (Komponentenerweiterungen für C++).

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

Hinweise

Wenn Fehler auftreten, wird von new der Wert Null zurückgegeben und eine Ausnahme ausgelöst. Weitere Informationen erhalten Sie unter Die Operatoren new und delete. Sie können dieses Standardverhalten ändern, indem Sie eine benutzerdefinierte Ausnahmebehandlungsroutine schreiben und die Funktion der Laufzeitbibliothek _set_new_handler mit dem Funktionsnamen als Argument aufrufen.

Weitere Informationen zum Erstellen von Objekten im verwalteten Heap finden Sie unter gcnew.

Wenn new verwendet wird, um für ein C++-Klassenobjekt Speicher zuzuweisen, wird der Konstruktor des Objekts aufgerufen, nachdem der Arbeitsspeicher zugewiesen wurde.

Verwenden Sie den delete-Operator, um den Arbeitsspeicher freizugeben, der mit dem new-Operator zugewiesen wurde.

Im folgenden Beispiel wird ein zweidimensionales Array der Größe dim durch 10 zugewiesen und dann freigegeben. Beim Zuweisen eines mehrdimensionalen Arrays müssen alle Dimensionen mit Ausnahme der ersten Konstantenausdrücke sein, die zu positiven Werten ausgewertet werden. Die Arraydimension ganz links kann ein beliebiger Ausdruck sein, der zu einem positiven Wert ausgewertet wird. Wenn Sie ein Array mithilfe des Operators new zuweisen, kann die erste Dimension null sein. Der Operator new gibt einen eindeutigen Zeiger zurück.

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

Der Typname darf keine const, volatile, Klassendeklarationen oder Deklarationen einer Enumeration enthalten. Daher ist der folgende Ausdruck ungültig:

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

Vom Operator new werden keine Referenztypen zugewiesen, da diese keine Objekte sind.

Der Operator new darf nicht zum Zuweisen einer Funktion verwendet werden. Er kann jedoch verwendet werden, um Funktionen Zeiger zuzuordnen. Im folgenden Beispiel wird ein Array von sieben Zeigern auf Funktionen, die ganze Zahlen zurückgeben, zugewiesen und dann freigegeben.

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

Wenn Sie den Operator new ohne zusätzliche Argumente verwenden und die Kompilierung mit der Option /GX, /EHa oder /EHs durchführen, wird vom Compiler Code zum Aufrufen des Operators delete generiert, sobald der Konstruktor eine Ausnahme auslöst.

In der folgenden Liste werden die Grammatikelemente von new beschrieben:

  • Platzierung
    Stellt eine Methode zur Übergabe zusätzlicher Argumente bereit, wenn Sie new überladen.

  • Typname
    Gibt den zuzuweisenden Typ an. Es kann entweder ein integrierter oder ein benutzerdefinierter Typ sein. Eine komplizierte Typspezifikation können Sie in Klammern einschließen, um die Reihenfolge der Bindung zu erzwingen.

  • Initialisierer
    Stellt einen Wert für das initialisierte Objekt bereit. Für Arrays können keine Initialisierer angegeben werden. Mit dem Operator new werden nur dann Objektarrays erstellt, wenn die Klasse über einen Standardkonstruktor verfügt.

Beispiel

Im folgenden Codebeispiel werden ein Zeichenarray und ein Objekt der Klasse CName zugewiesen und dann wieder freigegeben.

// 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 für die Platzierung des Operators new verwenden (ein Format, das neben der Belegungsgröße auch Argumente enthält), wird vom Compiler kein Platzierungsformat des Operators delete unterstützt, wenn der Konstruktor eine Ausnahme auslöst. Beispiel:

// 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 mit "new" zugeordneten Objekten

Initialisieren von mit "new" zugeordneten Objekten

Funktionsweise von "new"

operator new-Funktion