Partilhar via


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