28

重複の可能性:
C++ の「placement new」

C++ のインプレース コンストラクターとは何ですか?

例えばDatatype *x = new(y) Datatype();

4

6 に答える 6

48

これは配置の新しい演算子と呼ばれます。newオペレーターに割り当てることなく、データが割り当てられるメモリを提供できます。例えば:

Foo * f = new Foo();

上記により、メモリが割り当てられます。

void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo(); 

上記は、への呼び出しによって割り当てられたメモリを使用しますmallocnewこれ以上割り当てません。ただし、クラスに限定されません。への呼び出しで割り当てる任意の型に対して、新しい配置演算子を使用できますnew

配置 new の「落とし穴」は、キーワードを使用した配置 new 演算子の呼び出しによって割り当てられたメモリを解放しないことです。deleteデストラクタを直接呼び出して、オブジェクトを破棄します。

f->~Foo();

デストラクタが手動で呼び出された後、期待どおりにメモリを解放できます。

free(fm);
于 2010-09-21T19:48:07.930 に答える
7

簡単に言えば、コードは が指す空間にオブジェクトを構築するということyです。長い回答は、C++ FAQで最もよく説明されています。

于 2010-09-21T19:47:38.113 に答える
4

これはより一般的には「新しい配置」として知られており、C++ FAQ (「デストラクタ」エリア) でかなりよく議論されています。

生メモリ内にオブジェクトを構築できます。これは、特定の特殊な状況で役立ちます。たとえば、多数の可能性のあるオブジェクトに配列を割り当てたいが、多くの場合は必要ないため、必要に応じて構築したい場合などです。最大値に近い場所、またはカスタム メモリ アロケータを使用したい、または使用する必要があるためです。

于 2010-09-21T19:48:34.757 に答える
2

私はこれに慣れていませんが、既に割り当てられているメモリ ブロックにオブジェクトを書き込むことができます。また、メモリから消去するには、相互の削除ステートメントも必要です。

于 2010-09-21T19:46:31.917 に答える
2

メモリ プールを使用する場合は、インプレース コンストラクタを使用して、オブジェクトがプールから割り当てられるときにオブジェクトを初期化する必要があります。

于 2010-09-21T19:46:48.200 に答える
1

メモリを割り当てずにコンストラクタを呼び出す方法です。y新しいデータ型オブジェクトに十分なメモリを指すポインタでなければなりません。また、電話しないでdelete、電話して~DataType()ください。

于 2010-09-21T19:47:21.410 に答える