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