次の方法で共有


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