演算子の新しい関数
次のようなステートメントはプログラムで検出された場合関数 operator new の呼び出しに変換します :
解説
char *pch = new char[BUFFER_SIZE];
要求がストレージのバイト以外の場合はnew 演算子 は別のオブジェクト (つまりnew 演算子 の異なるポインターを繰り返し呼び出す) へのポインターを返します。割り当て要求のメモリが不足している場合new 演算子 は null を返すか例外をスローします (詳細については 新しいおよび削除の操作 を参照してください。
メモリ ルーチンを記述することで割り当てを再試行します ; 詳細については_set_new_handler を参照してください。詳細については次の設定では次のトピック メモリ不足の状態の処理を参照してください。
operator new の関数の 2 種類のスコープを次の表に示します。
演算子の新しい関数のスコープ
[演算子] |
スコープ |
---|---|
:: new 演算子 |
グローバル |
クラス名 :: new 演算子 |
Class |
new 演算子 への最初の引数は型です size_t STDDEF.H () で定義されている型および戻り値の型である void* 常にです。
グローバルの new 演算子 の関数は組み込み型new 演算子 のユーザー定義関数を含まない配列に入力するクラス型のオブジェクトにオブジェクトを割り当てるために 新規作成 の演算子が使用されている場合に呼び出されます。new 演算子 が定義されたクラス型のオブジェクトを割り当てるために 新規作成 の演算子が使用されている場合はそのクラスの new 演算子 が呼び出されます。
クラスに定義されて 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;
}
新規作成 のかっこ内に指定された引数は chInit の引数として Blanks::operator new に渡されます。ただしエラーが生成されます。次のようなコードはグローバルで new 演算子 の関数によって非表示になっています :
Blanks *SomeBlanks = new Blanks;
Visual C++ 5.0 以前ではnonclass " " と入力し クラス の型であるかどうか 新規作成 の演算子を使用して割り当てられたすべての配列 () に関係なく new 演算子 のグローバル関数を使用します。
Visual C++ 5.0コンパイラがサポートするメンバーの配列 新規作成 クラス宣言の 削除 の演算子になりました。次に例を示します。
// 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;
}