<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 newzurü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 newoder eine der callocFunktionen mallocoder 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 newzurückgegeben wurde. Das Standardverhalten besteht darin, die Auswertung delete( ptr )durchzuführen.

Beispiel

Ein Beispiel, das verwendet wird, operator deletefinden 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 newoder eine der callocFunktionen mallocoder 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_handlerauf. 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 oder exit.

  • Auslösen eines Objekts vom Typ bad_alloc.

Das Standardverhalten einer new_handler Funktion besteht darin, ein Objekt vom Typ bad_allocauszuwerfen. 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 newoperator deletezugewiesenen 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 nullptrzurückgegeben.

Rufen Sie auf, um den durch die zweite Form operator new von (d. h. wenn sie nicht zurückgegeben nullptrwurde) operator deletezugewiesenen Speicherplatz freizugeben.

Die dritte Funktion wird durch einen nicht zu überlastenden Platzierungsausdruck new des Formulars new ( ptr ) Taufgerufen. 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 newaufrufen, 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 nullptrzurü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
}