次の方法で共有


operator new 関数

次のようなステートメントがプログラムで検出された場合は、関数 operator new の呼び出しに変換されます。

解説

char *pch = new char[BUFFER_SIZE];

要求がゼロ バイトのストレージに対するものである場合、operator new は別のオブジェクトへのポインターを返します (つまり、operator new を繰り返し呼び出すと、複数の異なるポインターが返されます)。 割り当て要求のメモリが不足している場合、operator newNULL を返すか、例外をスローします (詳細については、「new 演算子と delete 演算子」を参照)。

メモリを解放し割り当てを再試行するルーチンを記述できます。詳細については、「_set_new_handler」を参照してください。 復旧方法の詳細については、「メモリ不足状態の処理」を参照してください。

operator new 関数の 2 つのスコープの説明を次の表に示します。

operator new 関数のスコープ

演算子

スコープ

::operator new

グローバル

class-name::operator new

クラス

operator new の最初の引数は、size_t 型 (STDDEF.H で定義した型) で、戻り値の型は常に void * である必要があります。

グローバルな operator new 関数は、new 演算子が、組み込み型のオブジェクト、ユーザー定義の operator new 関数を含まないクラス型のオブジェクト、および任意の型の配列の割り当てに使用されるとき、呼び出されます。 operator new が定義されたクラス型のオブジェクトを割り当てるために new 演算子が使用されると、そのクラスの operator new が呼び出されます。

クラスに定義された operator new 関数は、そのクラス型のオブジェクトのグローバルな operator new 関数を隠す静的メンバー関数です (したがって仮想関数にはできません)。 new を使用してメモリを割り当て、指定した値に設定する場合を考えます。

// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>

class Blanks
{
public:
    Blanks(){}
    void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
    void *pvTemp = malloc( stAllocateBlock );
    if( pvTemp != 0 )
        memset( pvTemp, chInit, stAllocateBlock );
    return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
   Blanks *a5 = new(0xa5) Blanks;
   return a5 != 0;
}

new のかっこ内で指定された引数は、chInit 引数として Blanks::operator new に渡されます。 ただし、グローバルな operator new 関数は隠されているため、次のようなコードではエラーが生成されます。

Blanks *SomeBlanks = new Blanks;

Visual C++ 5.0 以前では、new 演算子を使用して割り当てられる非クラス型とすべての配列 (class 型であるかどうかに関係なく) は、常に operator new グローバル関数を使用していました。

Visual C++ 5.0 から、コンパイラはクラス宣言でのメンバー配列の new および delete 演算子をサポートします。 次に例を示します。

// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
   void * operator new[] (size_t)
   {
      return 0;
   }
   void   operator delete[] (void*)
   {
   }
};

int main() 
{
   MyClass *pMyClass = new MyClass[5];
   delete [] pMyClass;
}

参照

関連項目

operator delete 関数

new 演算子 (C++)

delete 演算子 (C++)