これは、配置の新規演算子と呼ばれます。これにより、new
演算子でデータを割り当てることなく、データが割り当てられるメモリを提供できます。例えば:
Foo * f = new Foo();
上記はあなたのためにメモリを割り当てます。
void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo();
上記は、malloc
の呼び出しによって割り当てられたメモリを使用します。 new
はこれ以上割り当てません。ただし、クラスに限定されるものではありません。 new
の呼び出しで割り当てる任意のタイプにplacementnew演算子を使用できます。
プレースメントnewの「落とし穴」は、すべきではないdelete
キーワードを使用したプレースメントnew演算子の呼び出しによって割り当てられたメモリを解放することです。デストラクタを直接呼び出すことにより、オブジェクトを破棄します。
f->~Foo();
デストラクタが手動で呼び出された後、メモリを期待どおりに解放できます。
free(fm);
簡単に言うと、コードはy
が指すスペースにオブジェクトを作成します。長い答えは C++ FAQ で最もよくカバーされています。
これは「プレースメント新規」としてより一般的に知られており、C++ FAQ(「デストラクタ」領域)でかなりよく説明されています。
これにより、rawメモリにオブジェクトを構築できます。これは、多数の可能なオブジェクトに配列を割り当てたいが、必要がない場合が多いため、必要に応じて構築したい場合など、特定の特殊な状況で役立ちます。最大値に近い場所、またはカスタムメモリアロケータを使用する必要があるため。
私はこれに錆びていますが、すでに割り当てたメモリブロックにオブジェクトを書き込むことができます。また、メモリからクリアするには、相互削除ステートメントが必要です。
メモリプールを使用する場合は、インプレースコンストラクターを使用して、プールから割り当てられたオブジェクトを初期化する必要があります。
これは、メモリを割り当てずにコンストラクターを呼び出す方法です。 y
は、新しいDatatypeオブジェクトに十分なメモリをポインティングするポインタである必要があります。また、delete
を呼び出さず、~DataType()
を呼び出します。