<new>
演算子と列挙型
enum align_val_t
enum class align_val_t : size_t {};
operator delete
個々のオブジェクトのストレージの割り当てを解除するために、 delete
式によって呼び出される関数。
void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
パラメーター
ptr
削除によって値が無効になるポインター。
解説
最初の関数は、 delete
式によって呼び出され、 ptr
の値が無効になります。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、nullptr
ptr
の値、または以前のoperator new
呼び出しによって返された値を受け入れることです。
ptr
のnullptr
値の既定の動作は、何もしません。 ptr
のその他の値は、前に説明したように、new
呼び出しによって前に返される値である必要があります。 ptr
の null 以外の値の既定の動作は、前の呼び出しによって割り当てられたストレージを再利用することです。 operator new
、またはcalloc
、malloc
、またはrealloc
関数への後続の呼び出しによって、このような回収ストレージの一部またはすべてが割り当てられる条件では、指定されていません。
2 番目の関数は、フォーム new( std::size_t )
のnew
式に対応する配置delete
式によって呼び出されます。 何も実行されません。
3 番目の関数は、フォーム new( std::size_t, const std::nothrow_t& )
のnew
式に対応する配置delete
式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、nullptr
ptr
、または以前の operator new
呼び出しによって返されたの値を受け入れることです。 既定の動作では、 delete( ptr )
を評価します。
例
operator delete
の使用例については、「operator new
」を参照してください。
operator delete[]
オブジェクトの配列のストレージの割り当てを解除するために、 delete
式によって呼び出される関数。
void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
パラメーター
ptr
削除によって値が無効になるポインター。
解説
1 番目の関数は、ptr
の値を無効にするために delete[]
式によって呼び出されます。 関数は置き換え可能です。プログラムでこの関数のシグネチャを持つ関数を定義でき、これが C++ 標準ライブラリで定義された既定のバージョンに置き換わるためです。 必要な動作は、nullptr
ptr
、または以前の operator new[]
呼び出しによって返されたの値を受け入れることです。 null 値の ptr
に対する既定の動作では、何も実行されません。 その他の ptr
の値は、前述のとおり、呼び出しによって以前に返された値である必要があります。 このような null 以外の値の ptr
の既定の動作は、前の呼び出しによって割り当てられたストレージを再利用することです。 operator new
、またはcalloc
、malloc
、またはrealloc
関数への後続の呼び出しによって、このような回収ストレージの一部またはすべてが割り当てられる条件では、指定されていません。
2 番目の関数は、フォーム new[]( std::size_t )
のnew[]
式に対応する配置delete[]
式によって呼び出されます。 何も実行されません。
3 番目の関数は、フォーム new[]( std::size_t, const std::nothrow_t& )
のnew[]
式に対応する配置delete[]
式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、nullptr
ptr
の値を受け取るか、以前の演算子new[]
呼び出しによって返された値を受け入れることです。 既定の動作では、 delete[]( ptr )
を評価します。
例
operator delete[]
の使い方の例については、「operator new[]
」を参照してください。
operator new
new 式によって個々のオブジェクトにストレージを割り当てるために呼び出される関数。
void* operator new(std::size_t count);
void* operator new(std::size_t count, const std::nothrow_t&) noexcept;
void* operator new(std::size_t count, void* ptr) noexcept;
パラメーター
count
割り当てられるストレージのバイト数。
ptr
返されるポインター。
戻り値
新しく割り当てられたストレージの最小バイト アドレスへのポインター。 または、関数の 3 番目の形式を使用する場合は、 ptr
します。
解説
最初の関数は、 new
式によって呼び出され、そのサイズの任意のオブジェクトを表すために適切にアラインされたストレージの count
バイトを割り当てます。 この関数は 置き換え可能です。 つまり、プログラムは、C++ 標準ライブラリで定義されている既定のバージョンを置き換える、この関数シグネチャを使用して代替関数を定義できます。
必要な動作は、要求されたとおりにストレージを割り当てできる場合にのみ、null 以外のポインターを返すことです。 このようなそれぞれの割り当てによって、ストレージが、割り当て済みの他のストレージから分離されます。 後続の呼び出しで割り当てられるストレージの順序および連続性は不定です。 最初の格納値は不定です。 返されたポインターは、割り当てられたストレージの先頭 (最下位バイト アドレス) を指します。 count
が 0 の場合、返される値は、関数によって返される他の値と比較されません。
既定の動作ではループが実行されます。 ループ内で、関数はまず要求されたストレージの割り当てを試みます。 試行に malloc
の呼び出しが含まれるかどうかは指定されていません。 割り当てが成功した場合、関数は割り当てられたストレージへのポインターを返します。 それ以外の場合、関数は new_handler
型の指定された関数を呼び出します。 呼び出された関数が戻った場合、ループが繰り返されます。 このループは、要求されたストレージの割り当て試行が成功した場合、または呼び出された関数が戻らない場合に終了します。
new_handler
型の関数の必要な動作は、次のいずれかの操作を実行することです。
さらに多くのストレージを割り当てに使用できるようにして、戻ります。
abort
またはexit
のいずれかを呼び出します。型
bad_alloc
のオブジェクトをスローします。
new_handler
関数の既定の動作は、bad_alloc
型のオブジェクトをスローすることです。 nullptr
値は、既定のnew_handler
関数を指定します。
operator new
への連続する呼び出しによって割り当てられるストレージの順序と連続性は、そこに格納されている初期値と同様に指定されていません。
operator new
の最初の形式で割り当てられたストレージを解放するには、operator delete
を呼び出します。
2 番目の関数は、配置 new
式によって呼び出され、そのサイズのオブジェクトを表すために適切に配置 count
バイトのストレージを割り当てます。 この関数は 置き換え可能です。 つまり、プログラムは、C++ 標準ライブラリで定義されている既定のバージョンを置き換える、この関数シグネチャを使用して代替関数を定義できます。
既定の動作では、その関数が成功した場合に operator new( count )
が返されます。 それ以外の場合は nullptr
を返します。
2 番目の形式の operator new
によって割り当てられたストレージ (つまり、 nullptr
が返されなかった場合) を解放するには、 operator delete
を呼び出します。
3 番目の関数は、フォーム new ( ptr ) T
の、割り当てされていない配置new
式によって呼び出されます。 ここでは、 ptr
は 1 つのオブジェクト ポインターで構成されます。 既知のアドレスでオブジェクトを構築する場合に便利です。 ptr
が返されます。 このオブジェクトでデストラクターを明示的に呼び出す必要があります。
割り当てされていない配置 new
を呼び出す場合は、 delete
を呼び出さないでください。 代わりに、オブジェクトのデストラクターを呼び出した後、必要に応じて指定したメモリの割り当て解除を呼び出します。
new
のスロー動作またはスローしない動作については、「new
演算子とdelete
演算子を参照してください。
例
// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>
using namespace std;
class MyClass {
int member{ 0 };
public:
MyClass() {
cout << "MyClass at 0x" << this << " constructed.\n";
};
~MyClass() {
cout << "MyClass at 0x" << this << " destroyed.\n";
};
};
int main( )
{
// The first form of new / delete
MyClass* fPtr1 = new MyClass;
delete fPtr1;
// The second form (fail returns nullptr) of new / delete
MyClass* fPtr2 = new(nothrow) MyClass[2];
if (fPtr2)
delete fPtr2;
// The third form (non-allocating placement) of new / delete
char x[sizeof(MyClass)]; // x is automatic
MyClass* fPtr3 = new(&x[0]) MyClass;
fPtr3->~MyClass(); // Requires explicit destructor call
// no delete because x is on the stack
}
operator new[]
new 式によってオブジェクトの配列にストレージを割り当てるために呼び出される割り当て関数。
void* operator new[](std::size_t count);
void* operator new[](std::size_t count, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t count, void* ptr) noexcept;
パラメーター
count
配列オブジェクトに割り当てられるストレージのバイト数。
ptr
返されるポインター。
戻り値
新しく割り当てられたストレージの最小バイト アドレスへのポインター。 または、3 番目のフォームを使用する場合に ptr
します。
解説
1 番目の関数は new[]
式によって呼び出され、そのサイズ以下の配列オブジェクトを表すために適切にアラインされた count
バイトのストレージを割り当てます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、 operator new
の場合と同じです。 既定の動作では、成功した場合 operator new( count )
が返されます。 それ以外の場合は、 std::bad_alloc
例外 (または std::bad_alloc
から派生した例外) がスローされます。 この形式の operator new[]
によって割り当てられたストレージを解放するには、 operator delete[]
を呼び出します。
2 番目の関数は配置 new[]
式によって呼び出され、そのサイズの配列オブジェクトを表すために適切にアラインされた count
バイトのストレージを割り当てます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 既定の動作では、その関数が成功した場合に operator new( count )
が返されます。 それ以外の場合は nullptr
を返します。 この形式の operator new[]
によって割り当てられたストレージを解放するには、 operator delete[]
を呼び出します。 new
のスロー動作またはスローしない動作の詳細については、「new
演算子とdelete
演算子を参照してください。
3 番目の関数は、フォーム new( ptr ) T[ N ]
の、割り当てされていない配置new[]
式によって呼び出されます。 このフォームではメモリが割り当てられません。 ptr
パラメーターを介して渡されたメモリ内のオブジェクトを構築します。 ptr
が返されます。 作成されたオブジェクトごとに、デストラクターを明示的に呼び出す必要があります。 ptr
に十分なメモリを提供する責任があります。 new
式によって返される値に対してdelete[]
を呼び出さないでください。 代わりに、デストラクターを呼び出した後、必要に応じて、 ptr
の割り当てを解除します。
例
// new_op_array.cpp
// compile with: /EHsc
#include <new>
#include <iostream>
using namespace std;
class MyClass {
int member{ 0 };
public:
MyClass() {
cout << "MyClass at 0x" << this << " constructed.\n";
};
~MyClass() {
cout << "MyClass at 0x" << this << " destroyed.\n";
};
};
int main() {
// The first form of array new / delete
MyClass* fPtr1 = new MyClass[2];
delete[] fPtr1;
// The second form (fail returns nullptr) of array new / delete
MyClass* fPtr2 = new(nothrow) MyClass[2];
if (fPtr2)
delete[] fPtr2;
// The third form (non-allocating placement) of array new / delete
char x[2 * sizeof(MyClass) + sizeof(int)]; // x is automatic
MyClass* fPtr3 = new(&x[0]) MyClass[2];
fPtr3[1].~MyClass(); // Requires explicit destructor calls
fPtr3[0].~MyClass(); // Recommended in reverse construction order
// Don't delete[] fPtr3 here.
// delete[] &x[0] not required because x is on the stack
}