1

私はこの構文を消化するのに苦労しています:

void* operator new[](std::size_t, const std::nothrow_t&) throw();

これはまだ理解されていますが:

void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();

質問:

  1. newと下付き文字[]は別の演算子だと思いました。2つの演算子を組み合わせて1つの定義でオーバーロードするにはどうすればよいですか?

  2. またnowthrow。次の呼び出しは私には意味がありません(関数のシグネチャに関して)。

     int * p2 = new (nothrow) int;
    

誰かがbjarnetroustrupの本から関連するトピックへの参照を与えることができれば、それは素晴らしいことですが、難しい要件ではありません。

更新:両方の質問に答えてみてください:)

4

3 に答える 3

3

new[]と[]は完全に異なる2つの演算子です。

new []は配列の割り当て演算子、[]は配列の添え字アクセス演算子です。

new []はそれ自体の演算子であり、単に「new」アロケータと「[]」添え字演算子を組み合わせたものではありません。

于 2012-04-06T23:06:59.917 に答える
2

最初の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[]mallocnew T[count];

もう1つのマイナーなポイント:(operator newまたはoperator new[]クラスメンバーとして)を持つことも可能です。これにより、グローバルヒープを使用する他のクラスとは異なる方法で、そのクラスにメモリを割り当てることができます。これは、期待する小さなオブジェクトで最も一般的です。多数を割り当てます。これらの場合、グローバルヒープには、回避したいオーバーヘッドがかなりあることがよくあります。

最後に、rawメモリを割り当てる場合はoperator new、のように直接呼び出すこともできますvoid *a = ::operator new(1234);。これが一般的な唯一の場所は、ある種のコレクションクラスを独自に実装することを決定した場合です(たとえば、循環バッファが必要な場合)。

于 2012-04-06T23:19:30.140 に答える
1

newnew[]は2つの別個の演算子であり、実際には'[]'演算子とは関係ありません。delete pこれは、との違いで最もよくわかりdelete[] pます。が指す単一のインスタンスを削除しpますか、それともインスタンスの配列全体を削除しますか?

同様に、new[]オブジェクトの配列全体をすべて同じメモリブロックに割り当てる方法です。

于 2012-04-06T23:07:17.220 に答える