Funções <new>
get_new_handler
new_handler get_new_handler() noexcept;
Comentários
Retorna ao atual new_handler
.
launder
template <class T>
constexpr T* launder(T* ptr) noexcept;
Parâmetros
ptr
O endereço de um byte na memória que retém um objeto cujo tipo é semelhante a T.
Valor de retorno
Um valor do tipo T* que aponta para X.
Comentários
Também referido como uma barreira de otimização de ponteiro.
Usado como uma expressão de constante quando o valor de seu argumento puder ser usado em uma expressão de constante. Um byte de armazenamento é acessível por meio de um valor de ponteiro que aponta para um objeto se estiver dentro do armazenamento ocupado por outro objeto, um objeto com um ponteiro semelhante.
Exemplo
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
Fornece um objeto a ser usado como um argumento para as versões nothrow
de new
e delete
.
extern const std::nothrow_t nothrow;
Comentários
O objeto é usado como um argumento de função para corresponder ao tipo de parâmetro std::nothrow_t.
Exemplo
Confira operator new
e operator new[]
para obter exemplos de como std::nothrow_t
é utilizado como um parâmetro de função.
set_new_handler
Instala uma função de usuário que deve ser chamada quando o operador new falha ao tentar alocar memória.
new_handler set_new_handler(new_handler Pnew) throw();
Parâmetros
Pnew
O new_handler
a ser instalado.
Valor de retorno
0 na primeira chamada e o anterior new_handler
em chamadas subsequentes.
Comentários
A função armazena Pnew
em um ponteiro manipulador new
estático que ele mantém e, em seguida, retorna o valor armazenado anteriormente no ponteiro. O manipulador new
é usado por operator new
.
Exemplo
// 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