最初の2つは、グローバルな新しいオペレーターの署名です。(少し)価値があるのは、のoperator new
ような新しい式にスペースを割り当てるために使用されx = new T;
、 。operator new[]
のような新しい式にスペースを割り当てるために使用されx = new T[count];
ます。それが価値のある「小さな」というのは、かなり単純な理由によるものです。決して使用してはならないnew T[count]
ので、それがどのように機能するかは、ほとんど純粋に歴史的な好奇心です。
必要に応じて、オーバーロード::operator new
したり::operator new[]
、独自のヒープ割り当てを提供したりできます。基本的な要件に関する限り、この2つに違いはありません。どちらも、要求されたメモリ量へのポインタを割り当てて返すだけです。
渡される限り、nothrow
渡されるサイズoperator new
は常にオブジェクトのサイズに基づいてコンパイラによって計算され、配列の場合は新しいカウントを指定します。したがって、新しい式で指定したパラメーターは、に渡される2番目のパラメーターに変わりますoperator new
。
ポイントを強調するために、上記で十分に明確に述べていない可能性があります:(operator new
およびoperator new[]
)はによって使用されますが、新しい式(のようなものを言うときにコードにあるものx = new T;
)とは別のものです。非常によく似operator new
ています。「生の」メモリを割り当てるだけです。新しい式1は、これらの1つを使用してrawメモリを割り当て、コンストラクタを呼び出して、そのメモリにオブジェクト(またはの場合は複数)を割り当てます。この2つは明らかに関連していますが、実際には同じではありません。operator new[]
malloc
new T[count];
もう1つのマイナーなポイント:(operator new
またはoperator new[]
クラスメンバーとして)を持つことも可能です。これにより、グローバルヒープを使用する他のクラスとは異なる方法で、そのクラスにメモリを割り当てることができます。これは、期待する小さなオブジェクトで最も一般的です。多数を割り当てます。これらの場合、グローバルヒープには、回避したいオーバーヘッドがかなりあることがよくあります。
最後に、rawメモリを割り当てる場合はoperator new
、のように直接呼び出すこともできますvoid *a = ::operator new(1234);
。これが一般的な唯一の場所は、ある種のコレクションクラスを独自に実装することを決定した場合です(たとえば、循環バッファが必要な場合)。