Udostępnij za pośrednictwem


<new>, funkcje

get_new_handler

new_handler get_new_handler() noexcept;

Uwagi

Zwraca bieżący element new_handler.

uprać

template <class T>
    constexpr T* launder(T* ptr) noexcept;

Parametry

ptr
Adres bajtu w pamięci, który zawiera obiekt, którego typ jest podobny do T.

Wartość zwracana

Wartość typu T* wskazująca wartość X.

Uwagi

Określa się również jako barierę optymalizacji wskaźnika.

Używane jako wyrażenie stałe, gdy wartość argumentu może być używana w wyrażeniu stałym. Bajt magazynu jest osiągalny za pośrednictwem wartości wskaźnika, która wskazuje obiekt, jeśli w magazynie zajmowanym przez inny obiekt obiekt, obiekt o podobnym wskaźniku.

Przykład

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

Udostępnia obiekt, który ma być używany jako argument dla nothrow wersji i new delete.

extern const std::nothrow_t nothrow;

Uwagi

Obiekt jest używany jako argument funkcji, aby dopasować typ parametru std::nothrow_t.

Przykład

Zobacz operator new i operator new[] , aby zapoznać się z przykładami użycia std::nothrow_t jako parametru funkcji.

set_new_handler

Instaluje funkcję użytkownika, która ma być wywoływana, gdy operator nowy kończy się niepowodzeniem podczas próby przydzielenia pamięci.

new_handler set_new_handler(new_handler Pnew) throw();

Parametry

Pnew
Element new_handler do zainstalowania.

Wartość zwracana

0 przy pierwszym wywołaniu i poprzednim new_handler na kolejnych połączeniach.

Uwagi

Funkcja przechowuje Pnew w statycznym new wskaźniku obsługi , który obsługuje, a następnie zwraca wartość wcześniej przechowywaną w wskaźniku. Procedura new obsługi jest używana przez program operator new.

Przykład

// 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