検索

ホームページ  >  に質問  >  本文

c++ - 能否帮忙解释一下placement new的原型

void operator new( size_t, void *p ) throw() { return p; }

这是我查到关于placement new的原型,size_t为什么在“new(&str1) std::string("abc");”中没有体现?为什么直接return p就可以了,是因为这个函数并没有写完全(只是原型)吗?

天蓬老师天蓬老师2804日前623

全員に返信(1)返信します

  • 黄舟

    黄舟2017-04-17 15:41:48

    まず第一に、あなたが見つけたのは、placement new の宣言ではなく、operatorplacement new の宣言です。これらの演算子はヘッダー ファイル new で宣言されます。

    新しい演算子の配置に関して、C++11 標準には次の規則があります。

    18.6.1.3.1 これらの関数は予約されており、C++ プログラムは標準 C++ ライブラリ (17.6.4) のバージョンを置き換える関数を定義することはできません。(3.7.4) の規定は適用されません。これらの予約された配置形式は、演算子 new と演算子 delete です。

    つまり、これらの新しい演算子配置は当面は役に立ちません。

    その後、式 new(&str1) std::string("abc") は、見つかった宣言を呼び出しません (ただし、この式は演算子の配置 new を内部的に呼び出します)。演算子配置 new の呼び出しメソッドは ::operator new(size, pointer); です。


    C++ には 2 種類の new があり、1 つは new 式と呼ばれ、もう 1 つは演算子 new と呼ばれます。前者は後者を呼び出してメモリ割り当てを完了し、オブジェクトを構築します。演算子 new はヘッダー ファイル new で定義されます。プログラムにこのヘッダー ファイルが含まれていない場合、コンパイラは演算子 new のセットを自動的に生成します。

    言い換えると、placement new 式と new 式は内部でそれぞれ演算子配置 new と演算子 new を呼び出しますが、前者は現時点では「何も処理しません」、後者はストレージ領域に適用される「はずです」。 (通常、クラスは演算子 new をオーバーロードします。これはオーバーロードの後者です)

    返事
    0
  • キャンセル返事