Share via


<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
削除によって値が無効になるポインター。

解説

最初の関数は、無効の値ptrdeleteレンダリングするために式によって呼び出されます。 プログラムでは、この関数のシグネチャを持つ関数を定義できます。これは、C++ 標準ライブラリで定義されている既定のバージョンに置き換わります。 必要な動作は、その値または以前のptrnullptr呼び出しによって返された値をoperator new受け入れることです。

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

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

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

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

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