web-dev-qa-db-ja.com

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

重複の可能性:
C++の「新しい配置」

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

例えばデータ型* x = new(y)Datatype();

20
Akhil

これは、配置の新規演算子と呼ばれます。これにより、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);
40
linuxuser27

簡単に言うと、コードはyが指すスペースにオブジェクトを作成します。長い答えは C++ FAQ で最もよくカバーされています。

7

これは「プレースメント新規」としてより一般的に知られており、C++ FAQ(「デストラクタ」領域)でかなりよく説明されています。

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

4
Michael Burr

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

2
wheaties

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

2
stonemetal

これは、メモリを割り当てずにコンストラクターを呼び出す方法です。 yは、新しいDatatypeオブジェクトに十分なメモリをポインティングするポインタである必要があります。また、deleteを呼び出さず、~DataType()を呼び出します。

1
Fozi