Freigeben über


Funktionsweise von "new"

Der Zuweisungsausdruck, d. h. der Ausdruck, der den new-Operator enthält, führt drei Aktionen aus:

  • Sucht und reserviert Speicher für das zuzuweisende Objekt bzw. die zuzuweisenden Objekte. Nach Abschluss dieser Phase wird die richtige Menge an Speicherplatz zugewiesen. Es handelt sich jedoch noch nicht um ein Objekt.

  • Initialisiert das/die Objekt(e). Sobald die Initialisierung abgeschlossen wurde, sind genügend Informationen vorhanden, damit der zugeordnete Speicher ein Objekt sein kann.

  • Gibt einen Zeiger auf Objekte eines Zeigertyps zurück, der von new-type-name oder type-name abgeleitet wurde. Das Programm verwendet diesen Zeiger, um auf das neu zugeordnete Objekt zuzugreifen.

Mit dem new-Operator wird die operator new-Funktion aufgerufen. Für Arrays eines beliebigen Typs und für Objekte, die nicht vom Typ class, struct oder union sind, wird die globale Funktion ::operator new aufgerufen, um Speicher zuzuweisen. Klassentypobjekte können ihre eigene statische operator new-Memberfunktion auf Basis einer einzelnen Klasse definieren.

Wenn der Compiler den new-Operator zum Zuweisen eines Objekts vom Typ type erkennt, ruft er type**::operator new( sizeof(** type ) ) auf. Wenn kein benutzerdefinierter operator new-Parameter festgelegt ist, wird ::operator new( sizeof( type ) ) aufgerufen. Daher kann der new-Operator die richtige Menge an Speicherplatz für das Objekt zuweisen.

Hinweis

Das Argument für operator new ist vom Typ size_t.Dieser Typ ist in DIRECT.H, MALLOC.H, MEMORY.H, SEARCH.H, STDDEF.H, STDIO.H, STDLIB.H, STRING.H und TIME.H definiert.

Eine Option in der Grammatik ermöglicht die Festlegung der Platzierung (weitere Informationen hierzu finden Sie in der Grammatik für neuer Operator). Der placement-Parameter kann nur für benutzerdefinierte Implementierungen von operator new verwendet werden. Damit können weitere Informationen an operator new übergeben werden. Ein Ausdruck mit einem Feld für Platzierung wie T *TObject = new ( 0x0040 ) T; wird in T *TObject = T::operator new( sizeof( T ), 0x0040 ); übersetzt, wenn die Klasse "T" den Member-Operator "new" hat. Andernfalls wird der Ausdruck in T *TObject = ::operator new( sizeof( T ), 0x0040 ); übersetzt.

Das Feld Platzierung war ursprünglich dazu gedacht, die Zuordnung hardwareabhängiger Objekte zu benutzerspezifischen Adressen zu ermöglichen.

Hinweis

Obwohl das obige Beispiel nur ein Argument im Feld Platzierung veranschaulicht, gibt es keine Beschränkung, wie viele zusätzliche Argumente auf diese Weise an operator new übergeben werden können.

Auch wenn operator new für einen Klassentyp definiert wurde, kann der globale Operator verwendet werden, indem Sie das Format in diesem Beispiel nutzen:

T *TObject =::new TObject;

Der Bereichsauflösungsoperator (::) erzwingt die Verwendung des globalen new-Operators.

Siehe auch

Referenz

new-Operator (C++)