[/ Copyright 2019 Glen Joseph Fernandes (glenjofe@gmail.com) Distributed under the Boost Software License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) ] [section:alloc_construct alloc_construct, alloc_destroy] [simplesect Authors] * Glen Fernandes [endsimplesect] [section Overview] The header provides function templates `alloc_construct`, `alloc_construct_n`, `alloc_destroy`, and `alloc_destroy_n` for allocator aware and exception safe construction and destruction of objects and arrays. [endsect] [section Example] The following example allocates storage for an array of `n` elements of `T` using an allocator `a` and constructs `T` elements in that storage. If any exception was thrown during construction of an element, the constructed elements are destroyed in reverse order. ``` template auto create(A& a, std::size_t n) { auto p = a.allocate(n); try { boost::alloc_construct_n(a, boost::to_address(p), n); } catch (...) { a.deallocate(p, n); throw; } return p; } ``` [endsect] [section Reference] ``` namespace boost { template void alloc_destroy(A& a, T* p); template void alloc_destroy_n(A& a, T* p, std::size_t n); template void alloc_construct(A& a, T* p, Args&&... args); template void alloc_construct_n(A& a, T* p, std::size_t n); template void alloc_construct_n(A& a, T* p, std::size_t n, const T* l, std::size_t m); template void alloc_construct_n(A& a, T* p, std::size_t n, I begin); } /* boost */ ``` [section Functions] [variablelist [[`template void alloc_destroy(A& a, T* p);`] [[variablelist [[Requires][`A` is an /Allocator/]] [[Effects][`std::allocator_traits::destroy(a, p)`.]]]]] [[`template void alloc_destroy_n(A& a, T* p, std::size_t n);`] [[variablelist [[Requires][`A` is an /Allocator/]] [[Effects] [Destroys each `i`-th element in reverse order by calling `std::allocator_traits::destroy(a, &p[i])`.]]]]] [[`template void alloc_construct(A& a, T* p, Args&&... args);`] [[variablelist [[Requires][`A` is an /Allocator/]] [[Effects] [`std::allocator_traits::construct(a, p, std::forward(args)...)`.]]]]] [[`template void alloc_construct_n(A& a, T* p, std::size_t n);`] [[variablelist [[Requires][`A` is an /Allocator/]] [[Effects] [Constructs each `i`-th element in order by calling `std::allocator_traits::construct(a, &p[i])`.]] [[Remarks] [If an exception is thrown destroys each already constructed `j`-th element in reverse order by calling `std::allocator_traits::destroy(a, &p[j])`.]]]]] [[`template void alloc_construct_n(A& a, T* p, std::size_t n, const T* l, std::size_t m);`] [[variablelist [[Requires][`A` is an /Allocator/]] [[Effects] [Constructs each `i`-th element in order by calling `std::allocator_traits::construct(a, &p[i], l[i % m])`.]] [[Remarks] [If an exception is thrown destroys each already constructed `j`-th element in reverse order by calling `std::allocator_traits::destroy(a, &p[j])`.]]]]] [[`template void alloc_construct_n(A& a, T* p, std::size_t n, I begin);`] [[variablelist [[Requires] [[itemized_list [`A` is an /Allocator/][`I` is an /InputIterator/]]]] [[Effects] [Constructs each `i`-th element in order by calling `std::allocator_traits::construct(a, &p[i], *begin++])`.]] [[Remarks] [If an exception is thrown destroys each already constructed `j`-th element in reverse order by calling `std::allocator_traits::destroy(a, &p[j])`.]]]]]] [endsect] [endsect] [section Compatibility] When `BOOST_NO_CXX11_ALLOCATOR` is defined, and the C++11 allocator model is not supported, these functions invoke constructors and destructors directly without going through the supplied allocator. [endsect] [section Acknowledgments] Glen Fernandes originally implemented this functionality in Boost.Smart_Ptr and later moved these functions to Boost.Core for use in other Boost libraries, such as Boost.Multi_Array and Boost.Histogram. [endsect] [endsect]