void operator new( size_t, void *p ) throw() { return p; }
这是我查到关于placement new的原型,size_t为什么在“new(&str1) std::string("abc");”中没有体现?为什么直接return p就可以了,是因为这个函数并没有写完全(只是原型)吗?
黄舟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 をオーバーロードします。これはオーバーロードの後者です)