2011-11-28 12 views
7

プレースメントメモリにオブジェクトを作成するには、プレースメントnewを使用できます。私は事前に割り当てられたバッファに2つのオブジェクトを作成しました事前割り当てメモリにオブジェクトを作成する

char *buf = new char[1000]; //pre-allocated buffer 
string *p = new (buf) MyObject(); //placement new 
string *q = new (buf) MyObject(); //placement new 

はのは、次の例を考えてみましょう。 2つのオブジェクトは、バッファ内でランダムに作成されるか、または連続したメモリブロックで作成されますか?バッファ内にさらにオブジェクトを作成して連続したメモリブロックに格納したい場合、どうすればよいでしょうか?まずバッファに配列を作成し、配列の要素スロットに各オブジェクトを作成しますか?

+1

"バッファにさらにオブジェクトを作成して、それらを連続したメモリブロックに格納したい場合、どうすればよいですか?" 'std :: vector'を使うと、それは連続的に格納された動的配列です。 – GManNickG

答えて

5

2つのオブジェクトは、同じメモリ位置に作成されます。つまり、bufです。これはの定義されていない動作です(オブジェクトがPODでない限り)。

複数のオブジェクトを割り当てる場合は、ポインタを増やす必要があります。 buf + n * sizeof(MyObject)でも、整列の問題に注意してください。

また、完了したらデストラクタを呼び出すことを忘れないでください。

+1

バッファには 'new'が割り当てられていたため、配列を含むあらゆる型をサポートする配列があります。 (あなたは一般的に間違っているわけではなく、この場合、彼は安全です。) – GManNickG

+0

@GMan:ありがとう、良い点。私はあなたがメモリに異なるタイプのオブジェクトを配置したい場合は特別な注意が必要だと思います。 –

+0

+1 BTW、ここでPODはどういう意味ですか? –

3

次のコード行:

string *p = new(adr) MyObject(); 

はアドレスadrにMyObjectにオブジェクトを作成します。あなたが別のオブジェクトを作成し、次の時間、あなたはあなたの次のオブジェクトがadr + sizeof(MyObject)で作成する必要がありますので、ADRでのメモリは、第一の目的で使用されていることを知っています:

string *q = new(adr + sizeof(MyObject)) MyObject(); 

事前に割り当てられたメモリのポイント実行時に割り当てられないようになっています。これはかなり遅いです。あなたはループ/プログラムの始めに大きな割り当てを行います。次に、その割り当てのチャンクを使用するだけです。欠点は、自分のメモリを管理しなければならないということです。つまり、オブジェクトがどこに置かれているかを把握しなければならないということです。

+0

adr = static_cast (byteaddr)なら、あなたはそうするでしょう:string * q = new(adr + 1)MyObject(); –

関連する問題