Funções <new>

get_new_handler

new_handler get_new_handler() noexcept;

Comentários

Retorna o atual new_handler.

Lavar

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

Parâmetros

ptr
O endereço de um byte na memória que contém um objeto cujo tipo é semelhante a T.

Valor Retornado

Um valor do tipo T* que aponta para X.

Comentários

Também conhecido como uma barreira de otimização de ponteiro.

Usado como uma expressão constante quando o valor de seu argumento pode ser usado em uma expressão constante. Um byte de armazenamento é acessível por meio de um valor de ponteiro que aponta para um objeto se 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 nothrow versões 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

Veja operator new e operator new[] para obter exemplos de como std::nothrow_t é usado como um parâmetro de função.

set_new_handler

Instala uma função de usuário que deve ser chamada quando o novo operador falha em sua tentativa de alocar memória.

new_handler set_new_handler(new_handler Pnew) throw();

Parâmetros

Pnew
O new_handler a ser instalado.

Valor Retornado

0 na primeira chamada e o anterior new_handler em chamadas subsequentes.

Comentários

A função armazena Pnew em um ponteiro de manipulador estáticonew que ele mantém e retorna o valor armazenado anteriormente no ponteiro. O new manipulador é 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