私は本質的に、単一のクラスを割り当てるオブジェクト プール アロケータを書いています。必要なオブジェクトに合わせて十分なメモリを割り当て、内部のスペースへのポインタを渡しています。
ここで私の質問は次のとおりです。プール内でポインターを取得したら、そこにオブジェクトを作成するにはどうすればよいですか?
私は本質的に、単一のクラスを割り当てるオブジェクト プール アロケータを書いています。必要なオブジェクトに合わせて十分なメモリを割り当て、内部のスペースへのポインタを渡しています。
ここで私の質問は次のとおりです。プール内でポインターを取得したら、そこにオブジェクトを作成するにはどうすればよいですか?
新しい配置を使用します。そのようです:
new( pointer ) MyClass();
新しい配置を使用します。
std::vector<char> memory(sizeof(Myclass));
void* place = &memory[0];
Myclass* f = new(place) Myclass();
FAQ で定義されている方法は使用しないでください。
char memory[sizeof(Myclass)]; // No alignment guarantees on this.
FAQ に記載されているように、標準ではこのメモリのアラインメントに関する権限が与えられていないため、危険です。標準ベクトルを使用すると、ベクトルのデータ セクションが動的に割り当てられ、動的に割り当てられたメモリの整列が標準で保証されるため、整列が保証されます。
差出人: n2521 (デスクトップにあるコピー) セクション: 3.7.3.1
返されるポインタは、基本的なアラインメント要件 (3.11) を備えた完全なオブジェクト型のポインタに変換できるように適切にアラインされ、割り当てられたストレージ内のオブジェクトまたは配列にアクセスするために使用されます (ストレージが明示的に割り当て解除されるまで)。対応する割り当て解除関数への呼び出し)。
これは 3.11 を示しています
3.11 アライメント [basic.align]
5 アライメントには、弱いアライメントから強いアライメント、または厳密なアライメントへの順序があります。アラインメントが厳密なほど、アラインメントの値が大きくなります。アラインメント要件を満たすアドレスは、より弱い有効なアラインメント要件も満たします。
デストラクタを手動で呼び出すことを忘れないでください。
f->~Myclass()
新しい配置が役立つ場合があります。
新しい配置を使用
char memory[sizeof(Myclass)];
void* place = memory;
Myclass* f = new(place) Myclass();
覚えて
また、配置されたオブジェクトを破壊する責任はすべてあなたにあります。これは、デストラクタを明示的に呼び出すことによって行われます。
f->~Myclass();
編集
Martin York のコメントと標準の関連セクションを読んだ後、上記の方法 (配置 new でスタックに配置されたオブジェクトを使用) を使用すべきではないことは確かです。マーティンが提案したようstd::vector
に代わりに使用してください。placement new