<new>
-Funktionen
get_new_handler
new_handler get_new_handler() noexcept;
Hinweise
Gibt den aktuellen new_handler
Wert zurück.
waschen
template <class T>
constexpr T* launder(T* ptr) noexcept;
Parameter
ptr
Die Adresse eines Byte im Arbeitsspeicher, das ein Objekt enthält, dessen Typ T ähnelt.
Rückgabewert
Ein Wert vom Typ T* , der auf X verweist.
Hinweise
Auch als Zeigeroptimierungsbarriere bezeichnet.
Wird als konstanter Ausdruck verwendet, wenn der Wert des Arguments in einem konstanten Ausdruck verwendet werden kann. Ein Byte des Speichers kann über einen Zeigerwert erreicht werden, der auf ein Objekt verweist, wenn innerhalb des Speichers, der von einem anderen Objekt belegt wird, ein Objekt mit einem ähnlichen Zeiger.
Beispiel
struct X { const int n; };
X *p = new X{3};
const int a = p->n;
new (p) X{5}; // p does not point to new object because X::n is const
const int b = p->n; // undefined behavior
const int c = std::launder(p)->n; // OK
nothrow
Stellt ein Objekt bereit, das als Argument für die nothrow
Versionen von new
und delete
.
extern const std::nothrow_t nothrow;
Hinweise
Das Objekt wird als Funktionsargument verwendet, um auf den Parametertyp std::nothrow_t abzustimmen.
Beispiel
Hier finden operator new[]
Sie operator new
Beispiele für die std::nothrow_t
Verwendung als Funktionsparameter.
set_new_handler
Installiert eine Benutzerfunktion, die aufgerufen werden soll, wenn der Operator neu in seinem Versuch, Arbeitsspeicher zuzuweisen, fehlschlägt.
new_handler set_new_handler(new_handler Pnew) throw();
Parameter
Pnew
Die new_handler
zu installierende Datei.
Rückgabewert
0 (null) beim ersten Aufruf und der vorherige new_handler
bei nachfolgenden Aufrufen.
Hinweise
Die Funktion speichert Pnew
in einem statischen new
Handlerzeiger , den sie verwaltet, und gibt dann den wert zurück, der zuvor im Zeiger gespeichert wurde. Der new
Handler wird von operator new
.
Beispiel
// new_set_new_handler.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;
void __cdecl newhandler( )
{
cout << "The new_handler is called:" << endl;
throw bad_alloc( );
return;
}
int main( )
{
set_new_handler (newhandler);
try
{
while ( 1 )
{
new int[5000000];
cout << "Allocating 5000000 ints." << endl;
}
}
catch ( exception e )
{
cout << e.what( ) << endl;
}
}
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
Allocating 5000000 ints.
The new_handler is called:
bad allocation