table of contents
std::allocator(3) | C++ Standard Libary | std::allocator(3) |
NAME¶
std::allocator - std::allocator
Synopsis¶
Defined in header <memory>
template< class T > (1)
struct allocator;
template<> (2) (deprecated in C++17)
struct allocator<void>; (removed in C++20)
The std::allocator class template is the default Allocator used by all
standard
library containers if no user-specified allocator is provided. The default
allocator
is stateless, that is, all instances of the given allocator are
interchangeable,
compare equal and can deallocate memory allocated by any other instance of
the same
allocator type.
The explicit specialization for void lacks the member typedefs
reference, const_reference, size_type and difference_type. This (until
C++20)
specialization declares no member functions.
The default allocator satisfies allocator completeness requirements.
(since C++17)
Member types¶
Type Definition
value_type T
pointer (deprecated in C++17)(removed in C++20) T*
const_pointer (deprecated in C++17)(removed in C++20) const T*
reference (deprecated in C++17)(removed in C++20) T&
const_reference (deprecated in C++17)(removed in C++20) const T&
size_type std::size_t
difference_type std::ptrdiff_t
propagate_on_container_move_assignment (C++11) std::true_type
template< class U >
struct rebind
rebind (deprecated in C++17)(removed in C++20) {
typedef allocator<U>
other;
};
is_always_equal (C++11)(deprecated in C++23)(removed in std::true_type
C++26)
Member functions¶
constructor creates a new allocator instance
(public member function)
destructor destructs an allocator instance
(public member function)
address obtains the address of an object, even if operator& is overloaded
(until C++20) (public member function)
allocate allocates uninitialized storage
(public member function)
allocate_at_least allocates uninitialized storage at least as large as
requested
(C++23) size
(public member function)
deallocate deallocates storage
(public member function)
max_size returns the largest supported allocation size
(until C++20) (public member function)
construct constructs an object in allocated storage
(until C++20) (public member function)
destroy destructs an object in allocated storage
(until C++20) (public member function)
Non-member functions¶
operator== compares two allocator instances
operator!= (public member function)
(removed in C++20)
Notes¶
The member template class rebind provides a way to obtain an
allocator for a
different type. For example, std::list<T, A> allocates nodes of some
internal type
Node<T>, using the allocator
A::rebind<Node<T>>::other
(until C++11)
std::allocator_traits<A>::rebind_alloc<Node<T>>, which is
implemented in terms of
A::rebind<Node<T>>::other if A is an std::allocator
(since C++11).
Member type is_always_equal is deprecated via LWG issue 3170, because it
makes
custom allocators derived from std::allocator treated as always equal by
default.
std::allocator_traits<std::allocator<T>>::is_always_equal is not
deprecated and its
member constant value is true for any T.
Example¶
// Run this code
#include <iostream>
#include <memory>
#include <string>
int main()
{
// default allocator for ints
std::allocator<int> alloc1;
// demonstrating the few directly usable members
static_assert(std::is_same_v<int, decltype(alloc1)::value_type>);
int* p1 = alloc1.allocate(1); // space for one int
alloc1.deallocate(p1, 1); // and it is gone
// Even those can be used through traits though, so no need
using traits_t1 = std::allocator_traits<decltype(alloc1)>; // The
matching trait
p1 = traits_t1::allocate(alloc1, 1);
traits_t1::construct(alloc1, p1, 7); // construct the int
std::cout << *p1 << '\n';
traits_t1::deallocate(alloc1, p1, 1); // deallocate space for one int
// default allocator for strings
std::allocator<std::string> alloc2;
// matching traits
using traits_t2 = std::allocator_traits<decltype(alloc2)>;
// Rebinding the allocator using the trait for strings gets the same type
traits_t2::rebind_alloc<std::string> alloc_ = alloc2;
std::string* p2 = traits_t2::allocate(alloc2, 2); // space for 2 strings
traits_t2::construct(alloc2, p2, "foo");
traits_t2::construct(alloc2, p2 + 1, "bar");
std::cout << p2[0] << ' ' << p2[1] << '\n';
traits_t2::destroy(alloc2, p2 + 1);
traits_t2::destroy(alloc2, p2);
traits_t2::deallocate(alloc2, p2, 2);
}
Output:¶
7
foo bar
Defect reports
The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.
DR Applied to Behavior as published Correct behavior
redundant comparison propagate_on_container_move_assignment
LWG 2103 C++11 between allocator might provided
be required
LWG 2108 C++11 there was no way to show is_always_equal provided
allocator is stateless
See also¶
allocator_traits provides information about allocator types
(C++11) (class template)
scoped_allocator_adaptor implements multi-level allocator for multi-level
containers
(C++11) (class template)
uses_allocator checks if the specified type supports uses-allocator
(C++11) construction
(class template)
2024.06.10 | http://cppreference.com |