c++ - 能否帮忙解释一下placement new的原型
天蓬老师
天蓬老师 2017-04-17 15:39:48
0
1
621
void operator new( size_t, void *p ) throw() { return p; }

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(1)
黄舟

まず第一に、あなたが見つけたのは、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
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート