Alokatory

Biblioteka standardowa C++ używa specjalnych obiektów - alokatorów (allocators) - do przydzielania i zwalniania pamięci. Domyślny alokator używa operatorów new i delete do rezerwacji pamięci.

Alokatory służą jako baza dla implementacji własnych rozwiązań zarządzania pamięcią.

Biblioteka C++ definiuje domyślny alokator jako:

namespace std {
    template <typename T>
    class allocator;
}

Kontenery i algorytmy standardowe można parametryzować za pomocą alokatorów. Alokatory dostarczają interfejsu do przydzielenia i zwolnienia pamięci, oraz utworzenia i zniszczenia obiektów.

Wyrażenie Skutek
a.allocate(num) alokuje pamięć dla num elementów
a.construct(p,val) inicjalizuje element p wartością val
a.destroy(p) niszczy element wskazywany przez p
a.deallocate(p,num) zwalnia pamięć dla num elementów wskazywaną przez p

Szkielet implementacji domyślnego alokatora (C++11)

template <typename T>
class MyAlloc
{
public:
    // konieczna definicja value_type
    typedef T value_type;

    // puste konstruktory - brak stanu
    MyAlloc () noexcept = default;

    template <typename U>  MyAlloc (const MyAlloc<U>&) noexcept { }

    // alokacja pamięci
    T* allocate (std::size_t num)
    {
        // globalny operator new
        return static_cast<T*>(::operator new(num*sizeof(T)));
    }

    // zwolnienie pamięci
    void deallocate (T* p, std::size_t num)
    {
        // globalny operator delete
        ::operator delete(p);
    }
};

// wszystkie alokatory tego typu są tożsame
template <typename T1, typename T2>
bool operator== (const MyAlloc<T1>&, const MyAlloc<T2>&) noexcept {
    return true;
}

template <typename T1, typename T2>
bool operator!= (const MyAlloc<T1>&, const MyAlloc<T2>&) noexcept {
    return false;
}

Przykładem alokatora jest zdefiniowany w bibliotece Boost boost::pool_allocator.