<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
削除によって値が無効になるポインター。
解説
最初の関数は、無効の値ptr
をdelete
レンダリングするために式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、その値または以前のptr
nullptr
呼び出しによって返された値をoperator new
受け入れることです。
値のptr
既定のnullptr
動作は、何もしません。 その他の ptr
値は、前に説明したように、呼び出しによって new
前に返された値である必要があります。 null 以外の値の既定の動作は、前の ptr
呼び出しによって割り当てられたストレージを再利用することです。 このような回収ストレージの一部または全部が、後続の呼び出しによって、またはいずれかのcalloc
malloc
realloc
関数にoperator new
割り当てられる条件では、指定されていません。
2 番目の関数は、フォームnew( std::size_t )
の式にnew
対応する配置delete
式によって呼び出されます。 何も実行されません。
3 番目の関数は、フォームnew( std::size_t, const std::nothrow_t& )
の式にnew
対応する配置delete
式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、以前のptr
nullptr
呼び出し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++ 標準ライブラリで定義された既定のバージョンに置き換わるためです。 必要な動作は、以前のptr
nullptr
呼び出しoperator new[]
によって返された値を受け入れることです。 null 値の ptr
に対する既定の動作では、何も実行されません。 その他の ptr
の値は、前述のとおり、呼び出しによって以前に返された値である必要があります。 このような null 以外の値の既定の動作は、前の ptr
呼び出しによって割り当てられたストレージを再利用することです。 このような回収ストレージの一部または全部が、後続の呼び出しによって、またはいずれかのcalloc
malloc
realloc
関数にoperator new
割り当てられる条件では、指定されていません。
2 番目の関数は、フォームnew[]( std::size_t )
の式にnew[]
対応する配置delete[]
式によって呼び出されます。 何も実行されません。
3 番目の関数は、フォームnew[]( std::size_t, const std::nothrow_t& )
の式にnew[]
対応する配置delete[]
式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、以前の演算子new[]
のptr
nullptr
呼び出しによって返された値を受け入れることです。 既定の動作では、次の値を評価 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
返されるポインター。
戻り値
新しく割り当てられたストレージの最小バイト アドレスへのポインター。 または ptr
、関数の 3 番目の形式を使用している場合。
解説
最初の関数は、式によって呼び出され new
、そのサイズの任意のオブジェクトを表すために適切にアラインされたストレージのバイトを割り当てます count
。 この関数は置き換え可能です。 つまり、プログラムは、C++ 標準ライブラリで定義されている既定のバージョンを置き換える、この関数シグネチャを使用して代替関数を定義できます。
必要な動作は、要求されたとおりにストレージを割り当てできる場合にのみ、null 以外のポインターを返すことです。 このようなそれぞれの割り当てによって、ストレージが、割り当て済みの他のストレージから分離されます。 後続の呼び出しで割り当てられるストレージの順序および連続性は不定です。 最初の格納値は不定です。 返されたポインターは、割り当てられたストレージの先頭 (最下位バイト アドレス) を指します。 0 の場合 count
、返される値は、関数によって返される他の値と等しくありません。
既定の動作ではループが実行されます。 ループ内で、関数はまず要求されたストレージの割り当てを試みます。 試行に呼び出し 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
の詳細については、「The new
and delete
operators」を参照してください。
例
// 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
返されるポインター。
戻り値
新しく割り当てられたストレージの最小バイト アドレスへのポインター。 または ptr
、3 番目のフォームを使用する場合。
解説
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
詳細については、「The new
and delete
operators」を参照してください。
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
}
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示