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