次の方法で共有


<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++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、nullptrptrの値、または以前のoperator new呼び出しによって返された値を受け入れることです。

ptrnullptr値の既定の動作は、何もしません。 ptrのその他の値は、前に説明したように、new呼び出しによって前に返される値である必要があります。 ptrの null 以外の値の既定の動作は、前の呼び出しによって割り当てられたストレージを再利用することです。 operator new、またはcallocmalloc、またはrealloc関数への後続の呼び出しによって、このような回収ストレージの一部またはすべてが割り当てられる条件では、指定されていません。

2 番目の関数は、フォーム new( std::size_t )new式に対応する配置delete式によって呼び出されます。 何も実行されません。

3 番目の関数は、フォーム new( std::size_t, const std::nothrow_t& )new式に対応する配置delete式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、nullptrptr、または以前の 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++ 標準ライブラリで定義された既定のバージョンに置き換わるためです。 必要な動作は、nullptrptr、または以前の operator new[] 呼び出しによって返されたの値を受け入れることです。 null 値の ptr に対する既定の動作では、何も実行されません。 その他の ptr の値は、前述のとおり、呼び出しによって以前に返された値である必要があります。 このような null 以外の値の ptr の既定の動作は、前の呼び出しによって割り当てられたストレージを再利用することです。 operator new、またはcallocmalloc、またはrealloc関数への後続の呼び出しによって、このような回収ストレージの一部またはすべてが割り当てられる条件では、指定されていません。

2 番目の関数は、フォーム new[]( std::size_t )new[]式に対応する配置delete[]式によって呼び出されます。 何も実行されません。

3 番目の関数は、フォーム new[]( std::size_t, const std::nothrow_t& )new[]式に対応する配置delete[]式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、nullptrptrの値を受け取るか、以前の演算子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
}