4

内部でのみ呼び出す(二重)リンクリストを実装しようとしてplacement newいます。すべてのメモリを次のような割り当てられたプールに向けます。

char *memPool = new char[4096]; // One-off normal 'new'

最初は、事前に割り当てられたメモリ プール (を管理するクラス) へのポインターを受け取る独自のクラスを実装するつもりでした。ただし、 で同じ結果を達成できないことを最初に確認したいと思いますstd::list。特に、この SO の質問に対する David Rodríguez の回答の 3 番目のセクションが心配です。

コンポーネント ノードでandstd::listを呼び出す必要があるのは理にかなっていますが、すべてのノードがカスタム プールに割り当てられるように、この動作を変更したいと考えています。したがって、私の質問は次のとおりです。newdeleteplacement new

次のように指定する方法はありますかplacement new std::list:

std::list<std::shared_ptr<Cls>> myList = new (pool.getFreeAddr()) list<Cls>;

また、カスタム アロケータを使用してノードを割り当てる必要があるため、すべてが厳密に自分のメモリ プール内に格納されます。

shared_ptrs:カスタムメモリプールでもそれらが必要な場合は、カスタム割り当て/削除関数を使用する必要があることを認識しています。)

4

1 に答える 1

5

必ず:

  • MyAllocator要件を満たすクラス テンプレートを記述しAllocatorます (標準では [allocator.requirements])。
  • std::list<T, MyAllocator<T> >の代わりに a を使用しstd::list<T>ます。

リストの型を具体的にする必要がある場合std::list<T>(たとえば、 a を受け入れ、std::list<T> &インターフェイスを変更できない関数を呼び出したい場合)、アロケーターの型がコンテナーの型の一部であるため、うまくいきません。 .

アロケーターの要件に注意してください。それらは奇妙です。特に が必要rebindになりますがlist、これは少しトリッキーです。

さらに、C++03 では、アロケーターのインスタンスが尊重されるという保証はなく、アロケーターののみが尊重されます。つまり、割り当て元のプールへのポインターは、インスタンス変数としてではなく、静的な期間で格納する必要があることを意味します。C++11で変更されたと思いますが、間違っているかもしれません。プログラムで複数の異なるプールを使用する場合にのみ重要です。

于 2013-03-20T10:40:07.543 に答える