Freigeben über


<new> -Funktionen

get_new_handler

new_handler get_new_handler() noexcept;

Hinweise

Gibt den aktuellen new_handlerWert 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