<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