2012-04-18 14 views
3

私はベクトルを実装しようとしていますが、最良の実装ではアロケータクラス(メモリヘッダファイル)を使用していると読んでいます。私はそれが何であるか分かりませんし、サイトcplusplus.comは私を助けませんでした。アロケータとは<T>

+3

[ 'のstd :: allocator'](http://en.cppreference.com/w/cpp/memory/allocator) – Praetorian

答えて

6

これは、メモリ管理の抽象です。

Cプログラミングでは、チャンクがどのように割り当てられているかを知ることなく、メモリのチャンクを割り当てるために、基本的には関数malloc()free()を使用します。 C++では、関数はoperator new()operator delete()です。

std::allocatorは、割り当てられるオブジェクトのタイプである1つの型パラメータを取るテンプレートです。 std::allocatorのインスタンシエーションはoperator new()operator delete()を内部的に使用しますが、にはTの情報があるということは、Tオブジェクトの作成方法と破棄方法を知っているということです。 std::allocator<T>

四つの基本的な機能は以下のとおりです。

  1. allocate(size_type n)

    n * sizeof (T)バイトのためのスペースを割り当てることoperator new()を使用します。割り当てられているオブジェクトはどれもnTであることに注意してください。 Tオブジェクトの両方にスペースを割り当てないnew T()とは異なり、allocate(size_type n)nTオブジェクトのためのスペースしか割り当てません。それぞれを明示的に構築するには、construct()を使用する必要があります。

  2. deallocate(pointer p, size_type n)

    allocate()への前の呼び出しによって返されたメモリを解放するためにoperator delete()を使用します。 deallocate()はスペースを解放するだけであることに注意してください。 nTオブジェクトのそれぞれに明示的にdestroy()を呼び出す必要があります。そうしないと、メモリがリークする可能性があります。

  3. construct(pointer p, const T& val)

    pに位置TオブジェクトのTコピーコンストラクタを呼び出します。

  4. destroy(pointer p)

    pに位置Tオブジェクト上Tデストラクタを呼び出します。

+0

ありがとうございます! –

+0

+1、 'std :: allocator'でいくつかの記事とその答えを読んでいましたが、これは初めて理解しました。ありがとうございました :) –

0

標準ライブラリコンテナクラスのメモリ管理を行うクラスです。
しかし、独自のメモリ管理を提供したい場合は、std::allocatorがデフォルトのメモリ管理を提供します。

+1

それは 'デフォルト' のメモリ管理を行います。 – Nick

+0

はい、それはどのようにベクトルの実装で使用されますか? –

+0

@RondogiannisAristophanes:実装に依存し、コンテナのユーザーとしては、わかっている必要はありません。 –

関連する問題