<new>
Operatoren und Enumerationen
enum align_val_t
enum class align_val_t : size_t {};
operator delete
Die Funktion, die von einem delete
Ausdruck aufgerufen wird, um den Speicher für einzelne Objekte zu behandeln.
void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
Parameter
ptr
Der Zeiger, dessen Wert durch den Löschvorgang als ungültig gerendert werden soll.
Hinweise
Die erste Funktion wird von einem delete
Ausdruck aufgerufen, um den Wert ungültig zu rendern ptr
. Das Programm kann eine Funktion mit dieser Funktionssignatur definieren, die die von der C++-Standardbibliothek definierte Standardversion ersetzt. Das erforderliche Verhalten besteht darin, einen Wert davon zu akzeptieren, der ptr
nullptr
von einem früheren Aufruf operator new
zurückgegeben wurde.
Das Standardverhalten für einen nullptr
Wert in besteht darin ptr
, nichts zu tun. Ein anderer Wert muss ptr
ein zuvor von einem new
Aufruf zurückgegebener Wert sein. Das Standardverhalten für einen Nicht-NULL-Wert besteht ptr
darin, den vom früheren Aufruf zugewiesenen Speicher zurückzufordern. Es ist nicht angegeben, unter welchen Bedingungen Teil oder alle dieser re beanspruchten Speicher durch einen nachfolgenden Aufruf operator new
oder eine der calloc
Funktionen malloc
oder realloc
Funktionen zugewiesen werden.
Die zweite Funktion wird durch einen Platzierungsausdruck delete
aufgerufen, der einem new
Ausdruck des Formulars new( std::size_t )
entspricht. Dabei wird keine Aktion ausgeführt.
Die dritte Funktion wird durch einen Platzierungsausdruck delete
aufgerufen, der einem new
Ausdruck des Formulars new( std::size_t, const std::nothrow_t& )
entspricht. Das Programm kann eine Funktion mit dieser Funktionssignatur definieren, die die von der C++-Standardbibliothek definierte Standardversion ersetzt. Das erforderliche Verhalten besteht darin, einen Wert davon ptr
nullptr
zu akzeptieren oder die von einem früheren Aufruf operator new
zurückgegeben wurde. Das Standardverhalten besteht darin, die Auswertung delete( ptr )
durchzuführen.
Beispiel
Ein Beispiel, das verwendet wird, operator delete
finden Sie unter operator new
.
operator delete[]
Die Funktion, die von einem delete
Ausdruck aufgerufen wird, um den Speicher für ein Array von Objekten zu behandeln.
void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
Parameter
ptr
Der Zeiger, dessen Wert durch den Löschvorgang als ungültig gerendert werden soll.
Hinweise
Die erste Funktion wird durch einen delete[]
-Ausdruck aufgerufen, um den Wert von ptr
als ungültig zu rendern. Die Funktion lässt sich ersetzen, da das Programm eine Funktion mit dieser Funktionssignatur definieren kann, die die von der C++-Standardbibliothek definierte Standardversion ersetzt. Das erforderliche Verhalten besteht darin, einen Wert davon ptr
nullptr
zu akzeptieren oder die von einem früheren Aufruf operator new[]
zurückgegeben wurde. Als Standardverhalten für einen null-Wert von ptr
geschieht nichts. Jeder andere Wert von ptr
muss ein Wert sein, der zuvor durch einen Aufruf zurückgegeben wurde (siehe oben). Das Standardverhalten für einen solchen Nicht-Null-Wert besteht ptr
darin, den vom früheren Aufruf zugewiesenen Speicher zurückzufordern. Es ist nicht angegeben, unter welchen Bedingungen Teil oder alle dieser re beanspruchten Speicher durch einen nachfolgenden Aufruf operator new
oder eine der calloc
Funktionen malloc
oder realloc
Funktionen zugewiesen werden.
Die zweite Funktion wird durch einen Platzierungsausdruck delete[]
aufgerufen, der einem new[]
Ausdruck des Formulars new[]( std::size_t )
entspricht. Dabei wird keine Aktion ausgeführt.
Die dritte Funktion wird durch einen Platzierungsausdruck delete[]
aufgerufen, der einem new[]
Ausdruck des Formulars new[]( std::size_t, const std::nothrow_t& )
entspricht. Das Programm kann eine Funktion mit dieser Funktionssignatur definieren, die die von der C++-Standardbibliothek definierte Standardversion ersetzt. Das erforderliche Verhalten besteht darin, einen Wert davon ptr
nullptr
zu akzeptieren oder die von einem früheren Aufruf an den Operator new[]
zurückgegeben wurde. Das Standardverhalten besteht darin, die Auswertung delete[]( ptr )
durchzuführen.
Beispiel
Beispiele operator new[]
für die Verwendung von operator delete[]
.
operator new
Die Funktion, die durch einen new-Ausdruck aufgerufen wird, um Speicher für einzelne Objekte zu belegen.
void* operator new(std::size_t count);
void* operator new(std::size_t count, const std::nothrow_t&) noexcept;
void* operator new(std::size_t count, void* ptr) noexcept;
Parameter
count
Der zu belegende Speicherplatz in Bytes.
ptr
Der Zeiger, der zurückgegeben werden soll.
Rückgabewert
Ein Zeiger auf die niedrigste Byteadresse des neu zugewiesenen Speichers. Oder ptr
, wenn die dritte Form der Funktion verwendet wird.
Hinweise
Die erste Funktion wird von einem new
Ausdruck aufgerufen, um count
Bytes des Speichers entsprechend auszurichten, um jedes Objekt dieser Größe darzustellen. Diese Funktion kann ersetzt werden. Dies bedeutet, dass das Programm eine alternative Funktion mit dieser Funktionssignatur definieren kann, die die von der C++-Standardbibliothek definierte Standardversion ersetzt.
Das erforderliche Verhalten besteht darin, einen Nicht-Null-Zeiger nur zurückzugeben, wenn Speicher wie angefordert zugewiesen werden kann. Alle Zuordnungen dieser Art geben einen Zeiger auf Speicherplatz aus, der nicht mit belegtem Speicherplatz zusammenhängt. Reihenfolge und Kontinuität von durch aufeinanderfolgende Aufrufe belegtem Speicherplatz werden nicht angegeben. Auch der anfänglich gespeicherte Wert wird nicht angegeben. Der zurückgegebene Zeiger verweist auf den Anfang (die niedrigste Byteadresse) des zugewiesenen Speichers. Wenn count
null ist, wird der zurückgegebene Wert nicht mit einem anderen Wert verglichen, der von der Funktion zurückgegeben wird.
Standardmäßig wird eine Schleife ausgeführt. Innerhalb der Schleife versucht die Funktion zuerst den angeforderten Speicherplatz zu belegen. Gibt an, ob der Versuch einen Aufruf malloc
umfasst, nicht angegeben ist. Wenn der Zuordnungsversuch erfolgreich ist, gibt die Funktion einen Zeiger auf den zugewiesenen Speicher zurück. Andernfalls ruft die Funktion die angegebene Funktion des Typs new_handler
auf. Führt die aufgerufene Funktion eine Rückgabe aus, wird die Schleife wiederholt. Die Schleife wird beendet, wenn ein Versuch, den angeforderten Speicher zuzuweisen, erfolgreich ist oder wenn eine aufgerufene Funktion nicht zurückgegeben wird.
Das erforderliche Verhalten einer Funktion vom Typ new_handler
besteht darin, einen der folgenden Vorgänge auszuführen:
Stellt zusätzlichen Speicherplatz für die Zuordnung bereit und springt anschließend zurück.
Rufen Sie entweder
abort
oderexit
.Auslösen eines Objekts vom Typ
bad_alloc
.
Das Standardverhalten einer new_handler
Funktion besteht darin, ein Objekt vom Typ bad_alloc
auszuwerfen. Ein nullptr
Wert bestimmt die Standardfunktion new_handler
.
Die Reihenfolge und Fortlaufendkeit des Speichers, der durch aufeinander folgende Aufrufe operator new
zugewiesen wird, ist nicht angegeben, ebenso wie die dort gespeicherten Anfangswerte.
Um den durch die erste Form des Anrufs operator new
operator delete
zugewiesenen Speicherplatz frei zu machen.
Die zweite Funktion wird von einem Platzierungsausdruck new
aufgerufen, um count
Bytes des Speichers entsprechend auszurichten, um jedes Objekt dieser Größe darzustellen. Diese Funktion kann ersetzt werden. Dies bedeutet, dass das Programm eine alternative Funktion mit dieser Funktionssignatur definieren kann, die die von der C++-Standardbibliothek definierte Standardversion ersetzt.
Das Standardverhalten besteht darin, zurückzugeben operator new( count )
, wenn diese Funktion erfolgreich ist. Andernfalls wird nullptr
zurückgegeben.
Rufen Sie auf, um den durch die zweite Form operator new
von (d. h. wenn sie nicht zurückgegeben nullptr
wurde) operator delete
zugewiesenen Speicherplatz freizugeben.
Die dritte Funktion wird durch einen nicht zu überlastenden Platzierungsausdruck new
des Formulars new ( ptr ) T
aufgerufen. ptr
Hier besteht aus einem einzelnen Objektzeiger. Es kann nützlich sein, ein Objekt an einer bekannten Adresse zu erstellen. Die Funktion gibt ptr
zurück. Sie müssen den Destruktor explizit für dieses Objekt aufrufen.
Wenn Sie die Nichtzuweisungsplatzierung new
aufrufen, rufen Sie nicht auf delete
. Rufen Sie stattdessen den Deallocator für den von Ihnen bereitgestellten Speicher auf, nachdem Sie den Destruktor für das Objekt aufgerufen haben.
Informationen zum Auslösen oder Nicht-Auslösen-Verhalten von new
" finden Sie unter "The new
" und delete
"Operatoren".
Beispiel
// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;
class MyClass {
int member{ 0 };
public:
MyClass() {
cout << "MyClass at 0x" << this << " constructed.\n";
};
~MyClass() {
cout << "MyClass at 0x" << this << " destroyed.\n";
};
};
int main( )
{
// The first form of new / delete
MyClass* fPtr1 = new MyClass;
delete fPtr1;
// The second form (fail returns nullptr) of new / delete
MyClass* fPtr2 = new(nothrow) MyClass[2];
if (fPtr2)
delete fPtr2;
// The third form (non-allocating placement) of new / delete
char x[sizeof(MyClass)]; // x is automatic
MyClass* fPtr3 = new(&x[0]) MyClass;
fPtr3->~MyClass(); // Requires explicit destructor call
// no delete because x is on the stack
}
operator new[]
Die Zuordnungsfunktion, die durch einen new-Ausdruck aufgerufen wird, um Speicherplatz für ein Array von Objekten zu belegen.
void* operator new[](std::size_t count);
void* operator new[](std::size_t count, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t count, void* ptr) noexcept;
Parameter
count
Der Speicherplatz in Bytes, der für ein Array-Objekt belegt werden soll.
ptr
Der Zeiger, der zurückgegeben werden soll.
Rückgabewert
Ein Zeiger auf die niedrigste Byteadresse des neu zugewiesenen Speichers. Oder ptr
, wenn das dritte Formular verwendet wird.
Hinweise
Die erste Funktion wird durch einen new[]
-Ausdruck aufgerufen, um count
-Bytes im Speicher zu belegen, die genau auf alle Array-Objekte ausgerichtet sind, die höchstens diese Größe aufweisen. Das Programm kann eine Funktion mit dieser Funktionssignatur definieren, die die von der C++-Standardbibliothek definierte Standardversion ersetzt. Das erforderliche Verhalten entspricht dem für operator new
. Das Standardverhalten besteht darin, zurückzugeben operator new( count )
, wenn es erfolgreich ist. Andernfalls wird eine std::bad_alloc
Ausnahme ausgelöst (oder eine Ausnahme, die von std::bad_alloc
). Rufen Sie auf, operator delete[]
um den von dieser Form zugewiesenen operator new[]
Speicherplatz frei zu geben.
Die zweite Funktion wird durch einen Placement-new[]
-Ausdruck aufgerufen, um genau auf alle Objekte dieser Größe ausgerichtete count
-Bytes im Speicher zu belegen. Das Programm kann eine Funktion mit dieser Funktionssignatur definieren, die die von der C++-Standardbibliothek definierte Standardversion ersetzt. Das Standardverhalten besteht darin, zurückzugeben operator new( count )
, wenn diese Funktion erfolgreich ist. Andernfalls wird nullptr
zurückgegeben. Rufen Sie auf, operator delete[]
um den von dieser Form zugewiesenen operator new[]
Speicherplatz frei zu geben. Weitere Informationen zum auslösenden oder nicht auslösenden Verhalten von new
" finden Sie unter "The new
" und delete
"Operatoren".
Die dritte Funktion wird durch einen nicht zu überlastenden Platzierungsausdruck new[]
des Formulars new( ptr ) T[ N ]
aufgerufen. Dieses Formular weist keinen Arbeitsspeicher zu. Es erstellt die Objekte im Speicher, die über den ptr
Parameter übergeben werden. Die Funktion gibt ptr
zurück. Sie müssen den Destruktor explizit für jedes erstellte Objekt aufrufen. Sie sind dafür verantwortlich, genügend Arbeitsspeicher bereitzustellen ptr
. Rufen Sie den vom new
Ausdruck zurückgegebenen Wert nicht aufdelete[]
. Stattdessen können Sie die Destruktoren nach Dem Aufruf der Destruktoren bei Bedarf umleiten ptr
.
Beispiel
// new_op_array.cpp
// compile with: /EHsc
#include <new>
#include <iostream>
using namespace std;
class MyClass {
int member{ 0 };
public:
MyClass() {
cout << "MyClass at 0x" << this << " constructed.\n";
};
~MyClass() {
cout << "MyClass at 0x" << this << " destroyed.\n";
};
};
int main() {
// The first form of array new / delete
MyClass* fPtr1 = new MyClass[2];
delete[] fPtr1;
// The second form (fail returns nullptr) of array new / delete
MyClass* fPtr2 = new(nothrow) MyClass[2];
if (fPtr2)
delete[] fPtr2;
// The third form (non-allocating placement) of array new / delete
char x[2 * sizeof(MyClass) + sizeof(int)]; // x is automatic
MyClass* fPtr3 = new(&x[0]) MyClass[2];
fPtr3[1].~MyClass(); // Requires explicit destructor calls
fPtr3[0].~MyClass(); // Recommended in reverse construction order
// Don't delete[] fPtr3 here.
// delete[] &x[0] not required because x is on the stack
}