<new> 関数

get_new_handler

new_handler get_new_handler() noexcept;

解説

現在の new_handler を返します。

launder

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

パラメーター

ptr
型が T に類似しているオブジェクトを保持するメモリ内のバイトのアドレス。

戻り値

X を指す T* 型の値。

解説

ポインターの最適化バリアとも呼ばれます。

引数の値が定数式で使用される場合に、定数式として使用されます。 別のオブジェクトによって占有されているストレージ内、つまり類似したポインターを持つオブジェクトを指すポインター値によって、ストレージのバイトに到達できます。

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

newdeletenothrow バージョンの引数として使用するオブジェクトを提供します。

extern const std::nothrow_t nothrow;

解説

オブジェクトは、パラメーターの型 std::nothrow_t に一致する関数の引数として使用されます。

関数パラメーターとしての std::nothrow_t の使用例については、「operator new」および「operator new[]」を参照してください。

set_new_handler

演算子 new がメモリ割り当ての試行に失敗した場合に呼び出されるユーザー関数をインストールします。

new_handler set_new_handler(new_handler Pnew) throw();

パラメーター

Pnew
new_handler をインストールします。

戻り値

最初の呼び出しの場合は 0、それ以降の呼び出しの場合は以前の new_handler

解説

この関数は、関数が保持する静的な new handler ポインターに Pnew を格納し、ポインターに以前に格納された値を返します。 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