operator new (<new>)

個々のオブジェクトにストレージを割り当てるために new 式で呼び出される関数です。

void* operator new( 
   std::size_t _Count 
) throw(bad_alloc); 
void* operator new( 
   std::size_t _Count,         
   const std::nothrow_t& 
) throw( ); 
void* operator new( 
   std::size_t _Count,  
   void* _Ptr 
) throw( );

パラメーター

  • _Count
    割り当てるストレージのバイト数。

  • _Ptr
    返されるポインター。

戻り値

新たに割り当てられるストレージの最下位バイト アドレスへのポインター。 または _Ptr.

解説

最初の関数は、new 式からそのサイズ オブジェクトを表すために適切に配置する _Count ストレージのバイトを割り当てるために呼び出されます。 プログラムは、標準 C++ ライブラリで定義されている既定のバージョンのこの関数シグネチャを持つ別の関数を定義し、置き換えることのできるためです。

必須の動作は、ストレージが要求されたときに割り当てることができる場合にのみ NULL 以外のポインターを返します。 そのような各割り当ては他の割り当てられたストレージからのストレージにポインターを互いになります。 連続的な呼び出しによって割り当てられたストレージの順序と接近は指定されていません。 最初に保存されていた値は指定されていません。 返されるポインターは、割り当てられたメモリの開始 (最下位バイト アドレス) を指します。 値がゼロの場合、返される値は、関数が返す他の値に等しいしません。

既定の動作では、ループを実行することです。 ループ内で、最初に要求されたストレージを代入しようとしました。 try ブロックに含めるかどうか malloc (size_t) への呼び出しは指定されていません。 操作が成功した場合は、割り当てられたメモリへのポインター。関数の戻り値 それ以外の場合、この関数は指定 new ハンドラー。 呼び出された関数の戻り値、ループ繰り返します。 ループは要求されたメモリを割り当てようとして成功するか、呼び出された関数が戻るときに終了します。

new ハンドラーの動作は、次の操作の 1 つがを実行しています:

  • より多くのメモリを割り当てに使用できるようにし、返します。

  • 中止 または exit (int) を呼び出します。

  • 型 **bad_alloc.**オブジェクトをスローしてください。

new ハンドラー の既定の動作では、型 bad_allocオブジェクトをスローすることです。 null ポインターは既定の new ハンドラーを指定します。

そこに格納される初期値と同様に、operator new (size_t)、連続的な呼び出しによって割り当てられたストレージの順序と接近は指定されていません。

2 番目の関数は仮引数付きの new の式によってそのサイズ オブジェクトを表すために適切に配置する _Count ストレージのバイトを割り当てるために呼び出されます。 プログラムは、標準 C++ ライブラリで定義されている既定のバージョンのこの関数シグネチャを持つ別の関数を定義し、置き換えることのできるためです。

既定では、関数が成功した場合 operator new (_Count) を返します。 それ以外の場合は null ポインターを返します。

3 番目の関数は、フォーム new (args) の配置の new の式によって、T.呼び出されます。 ここでは、引数は 単一のオブジェクトのポインターで構成されます。 これは、既知のアドレスでオブジェクトを作成する場合に便利です。 関数の戻り値の _Ptr

operator newで割り当てられていないストレージに呼び出し 演算子の削除

新しいをスローするか、nonthrowing 動作の詳細については、「new 演算子と delete 演算子」を参照してください。

使用例

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass 
{
public: 
   MyClass( )
   {
      cout << "Construction MyClass." << this << endl;
   };

   ~MyClass( )
   {
      imember = 0; cout << "Destructing MyClass." << this << endl;
   };
   int imember;
};

int main( ) 
{
   // The first form of new delete
   MyClass* fPtr = new MyClass;
   delete fPtr;

   // The second form of new delete
   MyClass* fPtr2 = new( nothrow ) MyClass;
   delete fPtr2;

   // The third form of new delete
   char x[sizeof( MyClass )];
   MyClass* fPtr3 = new( &x[0] ) MyClass;
   fPtr3 -> ~MyClass();
   cout << "The address of x[0] is : " << ( void* )&x[0] << endl;
}

出力例

Construction MyClass.000B3F30
Destructing MyClass.000B3F30
Construction MyClass.000B3F30
Destructing MyClass.000B3F30
Construction MyClass.0023FC60
Destructing MyClass.0023FC60
The address of x[0] is : 0023FC60

必要条件

新しい <ヘッダー: >

名前空間: std

参照

関連項目

new operator (STL のサンプル)

nothrow_t 構造体

operator delete (<new>)