2016-08-02 7 views
3

std::allocatorを使用してnewdeleteをラップするカスタムベクトルを作成しています。reallocの代わりにstd :: allocatorを使用するにはどうすればよいですか?

要素の数がベクターの容量を超えると、私はバッファをもっと大きなものに再割り当てしたいと思います。私はrealloc()と呼んでこれを簡単に達成することができます。私は割り振り/割り当て解除の責任がアロケータにあるべきだと考えていたので、これをやりたくはありません。

しかし、std::allocatorのインターフェースを見ると、私はどのように再割り当てできるのか分かりません。

T* allocate(std::size_t n); 
void deallocate(T* p, std::size_t n); 

私はallocator::allocateを呼び出した後、allocator::deallocateだけではなくreallocする必要がありますのための唯一の方法がありますか?それは効率的ですか? std::vectorも同様でなければなりません。 std::allocatorはなぜreallocate機能を提供しないのですか?

+1

_ "なぜstd :: allocatorは再割り当て機能を備えていないのですか?" _これは[この質問](http://stackoverflow.com/questions/3105001/why-is-there-no-reallocation c-アロケータの機能性?rq = 1)。 – ArchbishopOfBanterbury

+0

[FYI] https://isocpp.org/wiki/faq/freestore-mgmt#realloc-and-renew – NathanOliver

+1

@NathanOliverこれは、「C++では、再配置を処理するためのより良い方法は、標準ライブラリコンテナを使用することですベクトルのように、自然に成長させてください "というのは、この質問の出発点です... –

答えて

4

私はstd :: allocatorを使ってカスタムベクトルを作成して、新しいものをラップして削除するとします。

一般的なケース(PODの専門化を除く)では、いずれにしてもreallocを使用することはできません。特定のメモリ位置に構築された任意のオブジェクトは、それが構築されたアドレスに関して非常に特定のアドレスを指す内部ポインタを有することができる。単純に(バイトコピーの意味で)それを動かすと、不変量が壊れる可能性があります。

したがって、あなたが言及している代替案は一般的に必要です。新しい配列をmove(または場合によってはcopy!)に割り当てる必要があります。オブジェクトを新しい場所に配置し、古い配列を割り当て解除します。もちろん、これには失敗する可能性のある1つ以上のステージが含まれます。一般的なケースでは実際にはreallocateできません。おそらく、これはアロケータが最初のケースでこの機能を持っていなかった理由です。配列ベースのコンテナでは、PODの特殊化に使用できるかもしれませんが、一般的にはそれらを実際に使用することはできません。

関連する問題