web-dev-qa-db-ja.com

特定のメモリアドレスに新しいC ++オブジェクトを作成しますか?

C++では、特定のメモリ位置に新しいオブジェクトを作成することはできますか?オブジェクトを作成したい共有メモリのブロックがあります。これは可能ですか?

37
Chris

placement new() が必要です。基本的には、ヒープから新しいメモリを割り当てる代わりに、既存のメモリのブロックを使用してコンストラクタを呼び出します。

編集:使用する前に、配置new()を使用して作成されたオブジェクトのデストラクタを明示的に呼び出す責任があることについての注意事項を必ず理解してくださいそれ!

62
D.Shawley

はい。演算子new()の配置バリアントを使用する必要があります。例えば:

void *pData = ....; // memory segment having enough space to store A object
A *pA = new (pData) A;

新しい配置は例外をスローしないことに注意してください。

12
dimba

多くの細粒度のオブジェクトを割り当てる場合、最善の方法は、何らかの新しいリングバッファーと組み合わせて新しい配置を使用することです。それ以外の場合は、オブジェクトポインター自体とは別に、ポインターを追跡する必要があります。

1
geva30

オブジェクトを配置したいメモリ位置へのポインタがあるとすると、ポインタを新しい型にキャストして、そのポインタの位置にオブジェクトを配置できると思います。これはnew()を必要としないソリューションです。

あなたの記憶を考えると:

_// you would use the pointer you have to your allocation of memory char* mem_start = new char[1024]; // Now we have 1024 bytes to play with_

それを与えられた型にキャストすることができます:

CustomType* object_ptr = (CustomType*) mem_start;

最後に、そこでオブジェクトを作成できます。

*(object_ptr) = CustomType();

0
AndruAllen

Windowsでは、 MapViewOfFileEx および VirtualAllocEx を使用して、優先仮想アドレスを指定できます。保証はありません。

0
PatrickvL