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.
解説
最初の関数は新しい式によってそのサイズ オブジェクトを表すように適切に配置される _Count ストレージのバイトを割り当てるために呼び出されます。プログラムは、標準 C++ ライブラリで定義されている既定のバージョンをこの関数のシグネチャで別の関数を定義して置き換えるため、置き換え可能です。
必須の動作は、ストレージを必須に割り当てることができる場合のみ null 以外のポインターを返します。そのような各割り当ては、他の割り当てられたストレージからもストレージへのポインターを表すことで説明します。連続呼び出しによって割り当てられるストレージの順序と接近は指定されていません。最初によって格納される値は指定されていません。割り当てられるストレージの先頭 (最下位バイト) 返されたポインターのアドレスへのポインター。計算がゼロの場合、返される値は、関数によって返される他の値に等しいは比較されません。
既定の動作では、ループを実行することです。ループ内で、関数は最初に要求されたストレージを割り当てるとします。まず、含めるかどうか mallocsize_t () への呼び出しは指定されていません。操作が成功した場合、関数は割り当てられるストレージへのポインターを返します。それ以外の場合、関数呼び出し、指定した 新しいハンドラー。呼び出された関数がを返した場合、ループの繰り返し。ループは要求されたストレージを割り当てるときに成功した場合は、呼び出された関数が返されないときに終了します。
新しいハンドラーに必要な動作は次の 1 種類の操作を実行することです:
割り当ての詳細ストレージを使用できるように、次に戻ります。
abort か exit (int) を呼び出します。
**bad_alloc.**型のオブジェクトをスローします
新しいハンドラー の既定の動作では bad_alloc型のオブジェクトをスローすることです。null ポインターで既定値を新しいハンドラーに示します。
そこに格納される初期値と同様に、operator new () size_tに、の連続呼び出しによって割り当てられたストレージの順序と接近は指定されていません。
2 番目の関数は、配置の新しい式によってそのサイズ オブジェクトを表すように適切に配置される _Count ストレージのバイトを割り当てるために呼び出されます。プログラムは、標準 C++ ライブラリで定義されている既定のバージョンをこの関数のシグネチャで別の関数を定義して置き換えるため、置き換え可能です。
既定では、関数が成功した場合 operator new_Count () を返します。それ以外の場合は null ポインターを返します。
3 番目の関数は、フォームの new (args) T の配置の new の式によって呼び出されます。ここでは、引数は 一つのオブジェクト ポインターで構成されます。これは、既知のアドレスにあるオブジェクトを構築するときに便利です。関数は _Ptr を返します。
operator newで割り当てられるストレージの呼び出し 演算子の削除。
新しいをスローするか、nonthrowing 動作の詳細については、新しい演算子と 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
必要条件
ヘッダー: <new>
名前空間: std