Поделиться через


<new>Функции

get_new_handler

new_handler get_new_handler() noexcept;

Замечания

Возвращает текущий new_handler.

отмывать

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

Параметры

ptr
Адрес байта в памяти, который содержит объект, тип которого похож на T.

Возвращаемое значение

Значение типа T* , указывающее на X.

Замечания

Также называется барьером оптимизации указателя.

Используется в качестве константного выражения, если значение его аргумента может использоваться в константном выражении. Байт хранилища доступен через значение указателя, указывающее на объект, если в хранилище, занятом другим объектом, объект с аналогичным указателем.

Пример

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

Предоставляет объект, используемый в качестве аргумента для nothrow версий new и delete.

extern const std::nothrow_t nothrow;

Замечания

Объект используется в качестве аргумента функции для соответствия типу параметра std::nothrow_t.

Пример

См operator new . и operator new[] примеры использования std::nothrow_t в качестве параметра функции.

set_new_handler

Устанавливает пользовательская функция, вызываемая при сбое оператора при попытке выделения памяти.

new_handler set_new_handler(new_handler Pnew) throw();

Параметры

Pnew
Установленный new_handler объект.

Возвращаемое значение

0 для первого вызова и предыдущее new_handler при последующих вызовах.

Замечания

Функция хранится Pnew в указателе статического new обработчика , который он поддерживает, а затем возвращает значение, ранее хранящееся в указателе. Обработчик new используется operator new.

Пример

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